考虑这个LINQ To SQL查询.它的目的是获取搜索词的字符串[]并将这些术语应用于SQL表上的一堆不同字段:
string[] searchTerms = new string[] {"hello","world","foo"};
List<Cust> = db.Custs.Where(c =>
searchTerms.Any(st => st.Equals(c.Email))
|| searchTerms.Any(st => st.Equals(c.FirstName))
|| searchTerms.Any(st => st.Equals(c.LastName))
|| searchTerms.Any(st => st.Equals(c.City))
|| searchTerms.Any(st => st.Equals(c.Postal))
|| searchTerms.Any(st => st.Equals(c.Phone))
|| searchTerms.Any(st => c.AddressLine1.Contains(st))
)
.ToList();
Run Code Online (Sandbox Code Playgroud)
提出了一个例外:
除Contains()运算符外,本地序列不能用于查询运算符的LINQ to SQL实现
问题: 为什么会引发此异常,以及如何重写查询以避免此异常?
nit*_*one 33
在查询中替换Any with Contains的用法.例如:
searchTerms.Contains(c.Email)
Run Code Online (Sandbox Code Playgroud)
这应该得到你正在寻找的结果.它向后看,但它是正确的 - 它将为包含searchTerms中所有元素的Contains中的每个字段生成一个IN运算符.
AddressLine1部分不会以这种方式工作 - 您必须自己循环生成比较
c.addressLine1.Contains(...)
Run Code Online (Sandbox Code Playgroud)
像PredicateBuilder这样的东西对此有帮助.
Dan*_*ter 11
只是一个想法(与问题没有直接关系,但它可能有助于其他观众):
我得到了与你相同的错误信息,即使我正确地使用了Contains()方法,我花了很长时间才弄清楚我的问题的根源是将IEnumerable返回到需要进一步过滤的东西L2S查询的结果.一旦我将函数的返回类型更改为IQueryable,问题就消失了.有意义的是,看到IEnumerable无法进一步过滤,但IQueryable可以.