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

Che*_*hev 2 .net c# linq linq-to-entities entity-framework

我正在使用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)));
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Han*_*ood 7

将其压缩到一个Where子句:

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