标签系统的LINQ查询:匹配任何几个标签?
问题描述:
我刚刚开始使用LINQ。我正在创建一个使用规范Post
和Tag
模型的实体框架应用程序。 A Post
包含ID
,Text
和Tags
,并且Tag
包含ID
,Name
和Posts
。标签系统的LINQ查询:匹配任何几个标签?
一个previous thread on StackOverflow教我如何查询一个Post
在搜索列表匹配所有Tag
对象(A 和乙和 C)。但如何查询Post
匹配任何Tag
(A 或 B 或 C)在列表中?谢谢你的帮助。
答
在我发布这个问题后,我就回答了问题。 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);
答
不知道这是否会工作或没有,但值得一试反正我想,如果你已经在使用WhereIn
。
var posts = context.Tags.WhereIn(tag => tag.Name, acceptableValues)
.SelectMany(t => t.Posts);
的WhereIn
应该给大家,是名称的一部分的标签,与SelectMany
应该给你含有这些标签的所有信息。
答
你可以ASLO做这样的与实体SQL
var post = ctx.Posts.Where("it.Tags.Id IN (1,2,3)");