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

时间:2010-03-24 20:56:38

标签: linq entity-framework tags

我刚刚开始使用LINQ。我正在创建一个使用规范PostTag模型的实体框架应用。 Post包含IDTextTagsTag包含IDNamePosts

previous thread on StackOverflow向我展示了如何查询匹配所有 Post个对象的Tag(A B C)在搜索列表中。但是,我如何查询与{em>任何 Post(A B C)相匹配的Tag清单?谢谢你的帮助。

3 个答案:

答案 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)");