微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决动态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);
        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。