【问题标题】:How to restructure Linq query to avoid using Contains() inside an Any() lambda expression (need a ContainsAll())如何重构 Linq 查询以避免在 Any() lambda 表达式中使用 Contains()(需要 ContainsAll())
【发布时间】:2011-09-06 17:07:24
【问题描述】:

我有一个查询,它在 Linq to 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

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

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

【问题讨论】:

    标签: linq linq-to-sql lambda contains


    【解决方案1】:
    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
    

    【讨论】:

    • 您好 msarchet,我刚刚尝试了您的解决方案,它似乎与单个术语的结果匹配。例如,如果我的搜索词是“foo”和“bar”,它将返回带有“foo”而不是“bar”的项目,反之亦然。您能否详细说明查询的第一部分是如何工作的?当你说“from x in foo from y in bar”与“for each x in foo, (do each y in bar query)”是一样的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 2019-11-29
    • 1970-01-01
    相关资源
    最近更新 更多