2

我正在尝试在 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() 因为它很昂贵并且会更改原始数据。

4

2 回答 2

4

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

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

于 2015-05-26T16:34:33.847 回答
2

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

LINQ to Objects 不同于 LINQ to SQL/Entities。后者需要将您的查询转换为 SQL 表达式,因此它不了解是什么StringComparsion

您可以AsEnumerable()在查询中使用将数据带入内存:

var otherMatchingDevices = (from d in selectedDevices
                            from c in mldb.Companies
                            where d.CompanyID == c.CompanyID && c.Deleted == 0)
                            .AsEnumerable()
                            .Where(searchTerms.Contains(d.Name.ToString(), 
                                               StringComparer.CurrentCultureIgnoreCase) || 
                                   searchTerms.Contains(c.CompanyName.ToString(), 
                                               StringComparer.CurrentCultureIgnoreCase))
                            .ToArray()
于 2015-05-26T16:36:38.513 回答