【问题标题】:How to group by with left join by multiple columns using linq and get count of grouped records?如何使用 linq 按多列左连接进行分组并获取分组记录数?
【发布时间】:2020-08-04 20:59:53
【问题描述】:

假设我们有: Employee 类(道具:EmployeeID、EmployeeName、DepartmentID、Department - 作为导航道具)和 Department 类(道具:DepartmentID、DepartmentName、Employees - 作为导航道具)。 这两个表之间的关系是一对多的。 现在具体例子:

员工

EmployeeID EmployeeName DepartmentID     
1          Peter        1               
2          Anna         1                
3          John         2   
          

部门

DepartmentID  DepartmentName                                                        
1             IT                                                                    
2             Marketing                                                              
3             HR         

                                                   

最终结果应该显示每个部门(DepartmentID、DepartmentName、NumOfEmployees),无论它是否有一个员工以及该部门的员工数量,例如:1、IT、2 | 2、市场营销、1 | 3,人力资源,0。

我的语法是:

var dbContext.Departments.Include(d => d.Employees).    
                          GroupBy(d => new { d.DepartmentID, d.DepartmentName }).
                          Select(x => new {
                                   DepartmentID = x.Key.DepartmentID,
                                   DepartmentName = x.Key.DepartmentName,
                                   NumOfEmployees = x.Count()
    }).ToList();

问题是属性 NumOfEmployees 为每个部门分配了 1,不知道为什么。 正确的 lambda 表达式 LINQ 语法是什么样的?

【问题讨论】:

  • 您正在对部门进行分组,然后对它们进行计数,因此您会得到1's。 Include 实际上被忽略了,因为您有 Select 声明。还有,为什么要按IDName 分组?
  • 你不想要NumOfEmployees = x.Employees.Count()吗?
  • @CamiloTerevinto 我假设因为它不会编译,因为IGrouping 没有Employees 属性。
  • @CamiloTerevinto 你的建议不起作用,因为 x 没有员工作为建议。
  • 那是因为x(更好地命名为dg)是一个有一个成员(部门记录)的IGrouping,所以如果你做了x.First().Employees.Count(),你会得到一个答案。想象一下,您取出 IncludeSelect,然后您有 dbContext.Departments.GroupBy(d => new { d.DepartmentID, d.DepartmentName }) - 您希望在每个组中出现什么?

标签: c# linq entity-framework-6


【解决方案1】:

我想说你在这里不需要GroupBy,可以简单地做:

var result = dbContext.Departments
    .Select(x => new 
    {
        DepartmentID = x.DepartmentID,
        DepartmentName = x.DepartmentName,
        NumOfEmployees = x.Employees.Count()
    })
    .ToList();

【讨论】:

  • 它肯定会起作用,但我想使用 group by 来获取分组记录的计数
  • @szti1516 “分组”是什么意思?如果 Departments 的 id 在数据库中是唯一的,那么分组将在此处为您提供相同的结果。
  • 我想用 group by 来练习一些 group by 例子。您发布的方式是正确的,但我想使用 group by。
  • @szti1516 让我们从另一端开始。你想得到什么 SQL 查询?此外,您似乎误解了Include。它只会连接数据以供选择,而不是查询本身。如果您想要join,您需要使用Queryable.Join 或查询语法join 执行连接。
  • @szti1516 您的查询仅按部门的唯一 ID 对部门进行分组,并计算每个组中的 部门NumOfEmployees 实际上是 NumOfDepartments,是的,它总是 1。换句话说,没有比这个答案更好的方法了。
猜你喜欢
  • 1970-01-01
  • 2017-01-19
  • 2017-11-21
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多