我刚刚开始使用LINQ。我正在创建一个使用规范Post
和Tag
模型的实体框架应用。 Post
包含ID
,Text
和Tags
,Tag
包含ID
,Name
和Posts
。
previous thread on StackOverflow向我展示了如何查询匹配所有 Post
个对象的Tag
(A 和 B 和 C)在搜索列表中。但是,我如何查询与{em>任何 Post
(A 或 B 或 C)相匹配的Tag
清单?谢谢你的帮助。
答案 0 :(得分:1)
在我发布这个问题后偶然发现了答案。 PredicateBuilder救援!
这是我的代码,使用PredicateBuilder
。它被设置为扩展方法:
public static IQueryable<Note> WhereContainsAnyTags(this IQueryable<Note> notes, IEnumerable<Tag> searchTags)
{
// Initialize
var predicate = PredicateBuilder.False<Note>();
// Select Notes that contain any search Tags
foreach (var searchTag in searchTags)
{
var tag = searchTag;
predicate = predicate.Or(note => note.Tags.Any(t => t.Id == tag.Id));
}
// Set return value
return notes.AsExpandable().Where(predicate);
}
以下是我如何调用代码:
searchResults = m_ViewModel.ObjectContext.Notes.WhereContainsAnyTags(m_ViewModel.SearchTags);
答案 1 :(得分:0)
不确定这是否有效,但无论如何我都值得一试,如果您已经在使用WhereIn
。
var posts = context.Tags.WhereIn(tag => tag.Name, acceptableValues)
.SelectMany(t => t.Posts);
WhereIn
应该为您提供属于该名称的所有标记,而SelectMany
应该会为您提供包含这些标记的所有帖子。
答案 2 :(得分:0)
您也可以使用Entity SQL
这样做var post = ctx.Posts.Where("it.Tags.Id IN (1,2,3)");