针对具有集合参数的集合属性的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
这确实有效,但似乎不对。我本可以用一些扩展方法做得更好,但我不知道该怎么做才能使这个实现正确。
知道吗?
这个怎么样:
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。确保您针对将要部署的同一版本进行开发:)