我有一个方法,它将一个字符串数组作为参数,并对一个集合属性进行查询,该集合属性也是一个字符串集合。如果该属性的字符串数组中的一个值作为参数传递,则应返回它。
这是我的代码:
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;
}
}
}
注意:
以下是完整的代码:
这可以完成这项工作,但它似乎并不合适。我本可以通过一些扩展方法使这更好,但无法弄清楚该技巧会做什么并使这个实现正确。
有什么想法吗?
答案 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)随着时间的推移已经有所改进。确保您针对要部署的相同版本进行开发:)