2

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

这是我的代码:

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

这可以完成工作,但它似乎并不正确。我本可以使用一些扩展方法使这变得更好,但无法弄清楚什么可以解决问题并使这个实现正确。

任何的想法?

4

1 回答 1

4

这个怎么样:

public IEnumerable<BlogPost> GetAll(string[] tags,
    bool includeUnapprovedEntries = false) {

    return GetAll(includeUnapprovedEntries)
        .Where(x => x.Tags.Any(t => tags.Contains(t));
}

您可能需要调用ToList()以实现结果。请注意,这将(希望!)导致INSQL 查询;如果您有大量标签,如果失败,我不会感到惊讶。(我不知道实体框架如何处理这种情况。)我相信标签数量较少应该没问题。

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

于 2012-04-04T07:09:29.153 回答