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; 

您甚至可以将该代码转换为扩展方法。 我有 :)