我有一个包含Items的实体模型,它可以属于一个或多个类别,并且可以有一个或多个标签。
我需要编写一个查询,查找给定ItemCategory的所有标记,最好只调用一次数据库,因为这会经常被调用。
我目前有:
Dim q = (From ic In mContext.ItemCategory _
Where ic.CategoryID = forCategoryID _
Select ic).SelectMany(Function(cat) cat.Items).SelectMany(Function(i) i.Tags) _
.OrderByDescending(Function(t) t.Items.Count).ToList
这几乎就在那里,除了它不包含每个标签的项目,所以我必须迭代,加载项目引用以找出每个标签相关的项目数量(用于字体大小调整)
理想情况下,我想返回一个List(Of TagCount),它只是一个结构,包含Tag作为字符串,Count作为整数。
我看过Group和Join,但我没有得到任何帮助,所以任何帮助都会非常感激!
答案 0 :(得分:1)
这应该有效(C#,对不起):
var tags = context.Tags.Include("Items").Where(t => t.Items.Any(i => i.ItemCategories.Any(ic => ic.CategoryID == forCategoryID))).ToList();
第二个获取标签名称和项目计数:
var tags = context.Where(t => t.Items.Any(i => i.ItemCategories.Any(ic => ic.CategoryID == forCategoryID))).Select(t => new { TagName = t.Name, ItemCount = t.Items.Count });
我们只从属于所需类别的项目中获取标签。
使用VB(我不确定它是否有效,我使用了翻译器):
Dim tags = context.Where(Function(t) t.Items.Any(Function(i) i.ItemCategories.Any(Function(ic) ic.CategoryID = forCategoryID))).[Select](Function(t) New With { .TagName = t.Name, .ItemCount = t.Items.Count })