如何解决动态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 举报,一经查实,本站将立刻删除。