LINQ忽略重音和案例
什么是最简单的方法来过滤元素与LINQ通过Where
方法忽略强调和大小写?
到目前为止,我已经能够通过调用属性的方法来忽略shell,我不认为这是一个好主意,因为它调用每个元素(右?)相同的方法。
所以这是我到目前为止:
var result = from p in People where p.Name.ToUpper().Contains(filter.ToUpper()) select p;
请告诉我,如果这是一个很好的做法,并忽略强调的最简单的方法。
要忽略大小写和重音符号(变音符号),您可以先定义一个像这样的扩展方法:
public static string RemoveDiacritics(this String s) { String normalizedString = s.Normalize(NormalizationForm.FormD); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < normalizedString.Length; i++) { Char c = normalizedString[i]; if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark) stringBuilder.Append(c); } return stringBuilder.ToString(); }
(修改忽略string比较中的重音字母 )
现在你可以运行你的查询了:
string queryText = filter.ToUpper().RemoveDiacritics(); var result = from p in People where p.Name.ToUpper().RemoveDiacritics() == queryText select p;
这很好,如果你只是在C#中迭代一个集合,但是如果你使用的是LINQ to SQL,最好避免在你的LINQ查询中使用非标准的方法(包括扩展方法)。 这是因为您的代码无法转换为有效的SQL,因此可以在SQL Server上运行,并进行所有可爱的性能优化。
由于在LINQ to SQL中似乎没有忽略重音符号的标准方法,在这种情况下,我build议将要search的字段types更改为不区分大小写和不区分重音(CI_AI)。
用你的例子:
ALTER TABLE People ALTER COLUMN Name [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AI
您的查询现在应该忽略重音和大小写。
请注意, 在运行上述查询之前 ,您需要暂时删除字段上的任何唯一约束,例如
ALTER TABLE People DROP CONSTRAINT UQ_People_Name
现在你的LINQ查询将会是:
var result = from p in People where p.Name == filter select p;
在这里查看相关问题。
更改整理:
ALTER TABLE dbo.MyTable ALTER COLUMN CharCol varchar(10)**COLLATE Latin1_General_CI_AS** NOT NULL;
下面是一些允许比较忽略重音的代码:
在string比较中忽略重音字母
我会有不抄袭代码的风格,以便作者可以得到他的答复。 现在,回答你的问题:
你会得到这段代码,并像这样使用它:
var result = from p in People where p.Name.ToUpper().Contains(RemoveDiacritics(filter.ToUpper())) select p;
您甚至可以将该代码转换为扩展方法。 我有 :)