我有一个名为“Notes”的管理文档的应用程序。与博客一样,Notes 可以根据一个或多个标签搜索匹配项,这些标签包含在 Note.Tags 集合属性中。标签具有名称和 ID 属性,并且根据 ID 进行匹配。用户可以指定多个要匹配的标签,在这种情况下,注释必须包含指定要匹配的所有标签。
我有一个非常复杂的 LINQ 查询来执行注释搜索,具有扩展方法和循环。坦率地说,它有一种真正的代码味道。我想用更简单的东西重写查询。我知道如果我将标签设为一个简单的字符串,我可以使用如下所示的内容:
var matchingNotes = from n in myNotes
where n.Tags.All(tag => searchTags.Contains(tag))
如果我的模型使用带有 ID 的 Tag 对象,我可以做那么简单的事情吗?查询会是什么样子。能用流畅的语法写出来吗?那会是什么样子?
最佳答案
我相信您可以在单个 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;
这也好不了多少。
关于LINQ 查询查找所有标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3539404/