如何使用LINQ进行简单的OR查询?

时间:2012-01-27 06:09:58

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

我正在使用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属性是否包含任何搜索词。

我的问题是,此代码包含列表中至少包含一个标记的所有链接,并匹配其中一个搜索字词。但我希望将两者结合在一起。我希望我的链接列表包含与列表中的一个或多个标记匹配的所有链接,或者匹配列表中的一个或多个搜索词。

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

有关实现目标的任何建议吗?

1 个答案:

答案 0 :(得分:7)

将其压缩到一个Where子句:

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