加入GroupJoin

时间:2014-06-12 16:24:31

标签: c# linq linq-to-entities

我正在尝试在群组加入的基础上加入额外的表格。下面的代码工作正常,但注释部分(当然无效)希望能让你想到我想加入ArticleCategories上的Category。这反映了DB,因此ArticleCategory有两个外键到Article(ArticleId)和Category(CategoryId)(unpluralized)。

var sql = from a in db.Articles
    join ac in db.ArticleCategories on a.ArticleId equals ac.ArticleId into acGrouped
    //join c in db.Categories on acGrouped.CategoryId = c.CategoryId (I want to join within the group)
    select new 
    {
        a,
        acGrouped
    };

当我循环结果将它们添加到模型时,我希望从Category表中访问CategoryName。在第一篇文章中:

sql.First().a将从第一篇文章中提供我需要的内容

sql.First().acGrouped将从第一篇文章

中为我提供一系列ArticleCategories

但是如何获得每个ArticleCategories的类别?像这样的东西: sql.First().acGrouped.First().Categories.CategoryNamesql.First().acGrouped.First().CategoryName where "CategoryName"仅在类别中,它会为我提供第一篇文章的第一个类别名称。 (假设集合不为空)

这对于平坦的结果来说是微不足道的,但我希望每篇文章都能输出结果。

2 个答案:

答案 0 :(得分:1)

您应该将文章类别加入之前的类别,然后将其加入文章,以便在您将其分组到论坛加入时已加入数据。< / p>

答案 1 :(得分:1)

如果我正确理解您的帖子,您希望能够列出与您拥有包含关系的联结表ArticleCategory的文章相关的所有类别。以下应该有效:

var articles = db.Articles;
var categories = db.Categories;
var articleCategories = db.ArticleCategories;

var query = from ac in articleCategories
    join a in articles on ac.ArticleId equals a.ArticleId
    join c in categories on ac.CategoryId equals c.CategoryId
    group c by a.ArticleName into g
    select new { ArticleName = g.Key, Categories = g.ToList() };

这是一个显示结果的小提琴:https://dotnetfiddle.net/VYBIfY

<强>更新

如果你&#39;想要从文章中获取更多属性,例如ArticleId,请按键将组更改为具有所需属性的新对象,如下所示:

var query = from ac in articleCategories
    join a in articles on ac.ArticleId equals a.ArticleId
    join c in categories on ac.CategoryId equals c.CategoryId
    group c by new { a.ArticleId, a.ArticleName } into g
    select new { Article = g.Key, Categories = g.ToList() };