标签系统的LINQ查询:匹配任何几个标签?

问题描述:

我刚刚开始使用LINQ。我正在创建一个使用规范PostTag模型的实体框架应用程序。 A Post包含ID,TextTags,并且Tag包含IDNamePosts标签系统的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)");