针对具有集合参数的集合属性的Linq查询

本文关键字:集合 属性 Linq 查询 参数 | 更新日期: 2023-09-27 18:30:08

我有一个方法,它将字符串数组作为参数,并查询集合属性,该属性也是字符串的集合。如果该属性的字符串数组中有一个值作为参数传递,则应返回该属性。

这是我的代码:

public IEnumerable<BlogPost> GetAll(string[] tags, 
    bool includeUnapprovedEntries = false) {
    foreach (var tag in tags) {
        foreach (var blogPost in GetAll(includeUnapprovedEntries).
            ToList().Where(x => x.Tags.Any(t => t == tag))) {
            yield return blogPost;
        }
    }
}

注:

这是完整的代码:

https://github.com/tugberkugurlu/MvcBloggy/blob/master/src/MvcBloggy.Data/DataAccess/SqlServer/BlogPostRepository.cs

这确实有效,但似乎不对。我本可以用一些扩展方法做得更好,但我不知道该怎么做才能使这个实现正确。

知道吗?

针对具有集合参数的集合属性的Linq查询

这个怎么样:

public IEnumerable<BlogPost> GetAll(string[] tags,
    bool includeUnapprovedEntries = false) {
    return GetAll(includeUnapprovedEntries)
        .Where(x => x.Tags.Any(t => tags.Contains(t));
}

您可能需要调用ToList()来实现结果。请注意,这将(希望!)导致SQL中的IN查询;如果你有大量的标签,如果失败了,我不会感到惊讶。(我不知道实体框架是如何处理这种情况的。)不过,我认为标记数量较少应该没问题。

请注意,是否支持可能取决于您使用的实体框架的版本;我似乎记得,随着时间的推移,一些像这样的转换(在"本地"集合上使用Contains)已经改进为SQL中的IN。确保您针对将要部署的同一版本进行开发:)

相关文章: