LINQ To Entities - Items,ItemCategories&标签

时间:2010-03-07 19:19:50

标签: entity-framework linq-to-entities

我有一个包含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,但我没有得到任何帮助,所以任何帮助都会非常感激!

1 个答案:

答案 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 })