使用集合参数对集合属性进行Linq查询

时间:2012-04-04 07:06:16

标签: c# linq entity-framework

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

这是我的代码:

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

这可以完成这项工作,但它似乎并不合适。我本可以通过一些扩展方法使这更好,但无法弄清楚该技巧会做什么并使这个实现正确。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

这个怎么样:

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)随着时间的推移已经有所改进。确保您针对要部署的相同版本进行开发:)