【问题标题】:How to do a simple OR query with LINQ?如何使用 LINQ 进行简单的 OR 查询?
【发布时间】:2012-01-27 06:09:57
【问题描述】:

我正在使用 LINQ to Entities 并尝试执行简单的 OR 查询。我有一个名为“链接”的表,当我运行查询时,我想包括包含标签列表中任何标签的所有链接以及与搜索词匹配的所有链接。例如:

var tags = new List<string>
{
    "games",
    "events",
    "recipes"
};

var searchTerms = new List<string>
{
    "hockey",
    "barbecue",
    "cheesecake",
    "basketball"
}

var links = _entityContainer.Links
    .Where(x => x.Tags.Any(y => tags.Contains(y.Name))
    .Where(x => searchTerms.Any(y => x.Title.Contains(y)));

注意:链接实体有一个名为 Tags 的导航属性,因此在第一个 .Where() 中,我正在检查链接集合中的每个标签,以查看我正在搜索的标签列表是否包含他们。

在第二个.Where() 中,我只是检查链接的 Title 属性是否包含任何搜索词。

我的问题是此代码包含所有链接,这些链接至少包含列表中的一个标签并匹配其中一个搜索词。但我想把两者都包括在内。我希望我的链接列表包含与列表中的 1 个或多个标签匹配或与列表中的 1 个或多个搜索词匹配的所有链接。

由于tags.Contains()searchTerms.Any(),我也遇到了问题,因为这些调用无法转换为要传递给 EF 的表达式。如果我使用ToList(),它们会起作用,但我不能这样做,因为它会将大量记录拉入内存。

对实现我的目标有什么建议吗?

【问题讨论】:

  • 不要使用ToList(),而是使用AsEnumerable(),这样可以大大减少内存占用,同时仍然允许您进行查询。

标签: c# .net linq entity-framework linq-to-entities


【解决方案1】:

将其压缩为一个 Where 子句:

var links = _entityContainer.Links
    .Where(x => 
        x.Tags.Any(y => tags.Contains(y.Name)) ||
        searchTerms.Any(y => x.Title.Contains(y)));

【讨论】:

  • 这更好,但我在调用tags.Contains()searchTerms.Any() 时仍然遇到问题。
猜你喜欢
  • 1970-01-01
  • 2011-06-25
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 2017-06-15
  • 2019-04-04
相关资源
最近更新 更多