【问题标题】:Entity Framework : Group by and Join实体框架:分组和加入
【发布时间】:2016-02-02 10:47:18
【问题描述】:

我需要从数据库中获取一些统计信息,但我无法让它按我的意愿工作。我有两个表,Task 和 Status,我需要获取每个 Status 的 Tasks 数量,例如,如果我有 New 和 Closed 状态,并且每个 Task 恰好有一个 Status,我想要一个这样的列表:

New      35
Closed   47

这是我目前所拥有的:

var statistics = database.Task
            .GroupBy(t => t.StatusId)
            .Select(g => new { Status = g.Key, Count = g.Count() }).ToList();

这会返回 StatusId 和 Task 计数,所以我需要做的就是将 StatusId 替换为 Status.Name。基本上我需要将上述内容与加入表状态相结合,然后获取状态.名称。但是在这里我失败了,有人可以帮助我吗?

【问题讨论】:

  • 如果您正确地为实体建模以具有导航属性,则不必加入。你能展示你的实体类吗?
  • 您在状态表上没有 FK 吗?如果你这样做了,EF 应该生成代理子类作为任务的一部分 - 然后你会在 linq 查询中找到t.Status.Name
  • 我有外键,通常我会做 t.Status.Name 但在 Select() 我猜我无法访问 t。无论如何它都不起作用。
  • 如果你的桌子上有StatusName,那么你为你的问题做了什么努力,那就是用StatusName@Hultan替换StatusId
  • @Viplock 我的表中没有 StatusName,我必须进行一些调整,见下文...

标签: c# join group-by entity-framework-6


【解决方案1】:

试试这个:

var statistics = database.Task
    .GroupBy(t => new { Id = t.StatusId, Name = t.Status.Name })
    .Select(g => new { StatusId = g.Key.Id, StatusName = g.Key.Name, Count = g.Count() })
    .ToList();

【讨论】:

  • 我认为任务表中没有statusname。所以它不会工作
  • 我只需要做一些小的调整:
  • var statistics = database.Task .GroupBy(t => new { Id = t.StatusId, Name = t.Status.Name }) .Select(g => new { Series = 1, Status = g.Key.Name, Count = g.Count() }) .ToList();
  • @Hultan:我相应地编辑了我的答案。如果它是你所需要的,你也应该接受一个 aswer...
  • @JanPalas:只需单击复选框,对吗?现在正确吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多