代码之家  ›  专栏  ›  技术社区  ›  David Veeneman

LINQ查询以查找所有标记?

  •  2
  • David Veeneman  · 技术社区  · 14 年前

    我有一个管理文档的应用程序叫做Notes。像博客一样,笔记可以搜索一个或多个标签的匹配项,这些标签包含在注释.标签集合属性。标记具有名称和ID属性,并根据ID进行匹配。用户可以指定多个要匹配的标记,在这种情况下,注释必须包含指定要匹配的所有标记。

    var matchingNotes = from n in myNotes
                        where n.Tags.All(tag => searchTags.Contains(tag))
    

    如果我的模型使用带有ID的标记对象,我能做这么简单的事情吗?查询是什么样子的。能用流利的语法写吗?那会是什么样子?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Timwi    14 年前

    我相信您可以在单个LINQ表达式中找到具有相关标记的注释:

    IQueryable<Note> query = ... // top part of query
    
    query = query.Where(note => searchTags.All(st =>
        note.Tags.Any(notetag => notetag.Id == st.Id)));
    

    不幸的是,没有流利的语法等价于 All Any 所以你能做的就是

    query = from note in query
            where searchTags.All(st =>
                note.Tags.Any(notetag => notetag.Id == st.Id))
            select note;
    

    这也不是很好。

        2
  •  0
  •   Timwi    14 年前

    对于初学者,请看我的评论;无论如何,我怀疑查询是错误的!我将简化它,只需分别强制每个标记存在:

    IQueryable<Note> query = ... // top part of query
    foreach(var tagId in searchTagIds) {
        var tmpId = tagId; // modified closures...
        query = query.Where(note => note.Tags.Any(t => t.Id == tmpId));
    }
    

        3
  •  0
  •   David Veeneman    14 年前

    重拾器

    我让ReSharper执行转换,它给了我:

    return searchTags.Aggregate<Tag, IQueryable<Note>>(DataStore.ObjectContext.Notes, (current, tag) => current.Where(n => n.Tags.Any(t => t.Id == tag.Id)).OrderBy(n => n.Title));