动态LINQ口音不敏感字符串查询

问题描述

我正在开发C#.Net MVC应用程序,并尝试为实体字段实现通用的搜索方法。随着我们页面的增长,我不想每次添加新页面时都编写一种搜索方法。

为此,我正在使用Dynamic.Core LINQ查询:在https://dynamic-linq.net/basic-simple-query处进行检查 我实现它的方式以下列方式工作:在视图中用户输入时,应用程序向控制器发送ajax请求,告诉它搜索该特定值,然后在上一个列表中显示新列表。

问题是:我可以使它不区分大小写,但不区分重音,并且想知道是否有人可以帮助我。

这是我的代码:

public static List<T> SearchEntityList<T>(this IQueryable<T> entityList,string searchBy,List<string> fieldsToCheck)
        {

            if (searchBy == null)
                return entityList.ToList();

            searchBy = searchBy.ToLower().RemoveDiacriticsUtil();
            // Dynamic LINQ Library

            string query = "";
            foreach (string str in fieldsToCheck)
            {
                query += str + ".ToString().ToLower().Contains(@0) ||";
            }

            if (query != null)
            {
                // Removes the last "OR" inserted on the foreach here on top
                query = query.Substring(0,query.Length - 3);
                try
                {
                    entityList = entityList.Where(query,searchBy);
                }
                catch (Exception e)
                {
                    // query is wrong,list wont be filtered.
                    return entityList.ToList();
                }
            }
                
            List<T> filteredList = entityList.ToList(); ;
            return filteredList;
        }

该方法接收表示要检查的字段的字符串列表,例如:“ Username” 然后建立一个字符串查询并与数据库一起检查。

此代码可以正常工作,并且不区分大小写,现在我想对其添加重音符号。

我修改此行

query += str + ".ToString().ToLower().Contains(@0) ||";

与此一起

query += str + "Collate(" + str + ".toString(),\"SQL_Latin1_General_CP1_CI_AI\").Contains(@0) ||";

现在我无法使其工作。 出现此错误:

"No applicable method 'Collate' exists in type '...'"

我测试了很多其他内容,例如RemoveDiacritics等。但是它们不适用于动态字符串linq查询...

想知道是否有人已经遇到了同样的问题。谢谢!

解决方法

您在正确的轨道上。 在使用动态linq之前,您需要注册您的自定义扩展方法:

    // Registration for the default custom type handler
    [DynamicLinqType]
    public static class MyExtensions
    {
        // taken from: https://stackoverflow.com/questions/359827/ignoring-accented-letters-in-string-comparison/368850
        public static string RemoveDiacritics(this string text)
        {
            return string.Concat(
                text.Normalize(NormalizationForm.FormD)
                    .Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch) !=
                                 UnicodeCategory.NonSpacingMark)
            ).Normalize(NormalizationForm.FormC);
        }
    }

    public static class Entry
    {
        public static void Main(string[] args)
        {
            // your input
            var query = "éè";

            // clean it using your extension method
            var cleanQuery = query.RemoveDiacritics();

            // a test set for this demo
            IQueryable<string> testSet = new EnumerableQuery<string>(new List<string>()
            {
                "soméè","tèèst","séét","BBeeBB","NoMatchHere"
            });
            
            var results = testSet.Where("it.RemoveDiacritics().Contains(@0)",cleanQuery);
            Debug.Assert(results.Count() == 4);
        }
    }

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...