c# - 不区分大小写的 Array.Contains 在 Linq 查询中

标签 c# linq linq-to-sql case-insensitive stringcomparer

我正在尝试在 Linq 查询中的字符串数组上使用 Array.Contains:

var otherMatchingDevices = from d in selectedDevices
                           from c in mldb.Companies
                           where d.CompanyID == c.CompanyID && c.Deleted == 0
                           where searchTerms.Contains(d.Name.ToString(), StringComparer.CurrentCultureIgnoreCase) || searchTerms.Contains(c.CompanyName.ToString(), StringComparer.CurrentCultureIgnoreCase)
                           select d;

当查询被评估时,它崩溃并显示“不支持的重载用于查询运算符‘包含’。

我使用 StringComparer 测试了这段代码,它工作正常并打印出“fOO”:

string[] sList = { "fOO", "bar" };
string[] array = { "foo" };
List<string> stringlist = sList.ToList();
var qry = from s in stringlist
          where array.Contains(s, StringComparer.CurrentCultureIgnoreCase)
          select s;
if (qry.Count() > 0) Console.WriteLine(qry.First().ToString());

任何人都可以告诉我如何在 Linq 查询中使用不区分大小写的 Array.Contains 吗?我不想转换原始字符串 ToUpper() 或 ToLower(),因为它很昂贵并且会更改原始数据。

最佳答案

您的第一个片段是使用 Linq to SQL 调用的,这意味着它最终会被翻译成 SQL。因此,比较是否区分大小写取决于表列的 COLLATION。这就是 Linq 抛出异常的原因,因为它不能保证区分大小写。

您的第二个查询片段是使用 Linq to Objects 执行的,因此可以强制执行字符串相等性,因为实际的 string 已经在内存中。

关于c# - 不区分大小写的 Array.Contains 在 Linq 查询中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30464114/

相关文章:

c# - C# 中两个几乎相同的 Web 引用的接口(interface)

c# - ASP.NET Core 中的中间件是如何执行的

linq选择m :n user:groups

c# - 动态构建 LINQ-To-Entities Where 子句

Linq-to-sql orderby thenby

c# - 将静态列表分配给非静态列表

c# - 如何使用 C# 在 Windows CE 中将 SQL Server Compact 表导出到 Excel?

c# - 数据表和 LINQ 父/子关系

c# - linq2sql : Cannot add an entity with a key that is already in use

c# - 如何从数据库中选择一周的日期?