如何重构Linq查询以避免在Any()lambda表达式中使用Contains()(需要一个ContainsAll())

时间:2011-06-01 23:02:11

标签: linq linq-to-sql lambda contains

我有一个查询,它会在Linq中向Sql抛出一个异常。

Local sequence cannot be used in LINQ to SQL implementation of query operators except the Contains() operator.

我已经看到了很多相关的问题所以我(大致)理解为什么它不起作用的原因(lambda表达式中的值term不能转换为SQL查询的字符串值),但是我不知道如何重组这个。

var searchTerms = userQuery.Split(' ').ToList().ConvertAll(term => term.ToLower());

var qry = (from tree in someQueryable
           join widget in myDb.Widgets
           on tree.ParentId equals widget.Id
           where
               searchTerms.All(term => tree.Title.ToLower().Contains(term)    //Can't use Contains on term, as term isn't a local variable
               || searchTerms.All(term => widget.Title.ToLower().Contains(term)    //And again here
               || (tree.Description != null && searchTerms.All(term =>
                                                tree.Description.ToLower().Contains(term)))    //And here
           orderby tree.SomeDate descending
           select tree);

如何获取标题,说明或ParentWidget.Title包含所有搜索字词的所有trees

我已尝试迭代每个术语,但是这给了我匹配单个术语的问题,而不是所有术语。

更新 我通过改变我的要求解决了这个问题:) 我仍然很想知道如何实现我的初始要求。

1 个答案:

答案 0 :(得分:0)

from term in SearchTerms
from tree in someQueryable
join widget in myDb.Widgets
where tree.Title.ToLower().Contains(term) ||
      widget.Title.TowLower().Contains(term) ||
      (tree.Description != null && tree.Description.ToLower.Contains(term))
orderby tree.SomeDate descending
select tree