LINQ聚合多个表

本文关键字:LINQ | 更新日期: 2023-09-27 18:06:45

我有以下数据库。公司名单。每个公司都有多个雇员和多个承包商。

dbo.Companies (CompanyId, Name)
dbo.Employees (Id, CompanyId, Name ...)
dbo.Contractors(Id, CompanyId, Name...)

我想得到这样的输出

CompanyName #Employees #Contractors
abc           0             10
xyz           25            999

我试图避免做2查询,一个得到承包商和一个得到员工,然后合并它们。有没有一种方法可以一气呵成?

的被害者。我有

class CompanySummary{
string Name {get; set;}
int EmpCount {get; set;}
int ConCount {get; set;}
}
所以我可以使用这种类型的集合作为结果

LINQ聚合多个表

如果您已经定义了导航属性(如果您还没有定义导航属性,现在可能是这样做的好时机),那么查询应该非常简单:

var query = from c in db.Companies
            select new CompanySummary
            {
                Name = c.Name,
                EmpCount = c.Employees.Count(),
                ConCount = c.Contractors.Count(),
            };

当然你也可以手动操作,但以上是EF的首选方式:

var query = from c in db.Companies
            select new CompanySummary
            {
                Name = c.Name,
                EmpCount = db.Employees.Count(e => e.CompanyId == c.Id),
                ConCount = db.Contractors.Count(cc => cc.CompanyId == c.Id),
            };

在这两种情况下,您将得到一个SQL查询

如果您正在使用实体框架与数据库通信,并与外键链接的表,您可能可以在一个查询中完成。它看起来像这样:

IEnumerable<CompanySummary> companySummary = null; 
using (CompanyEntities dbContext = new CompanyEntities())
{
     companySummary = dbContext.Companies
         .Include(company => company.Employees)
         .Include(company => company.Contractors)
         .Select(company => new CompanySummary
         {
             Name = company.Name,
             EmpCount = company.Employees.Count(),
             ConCount = company.Contractors.Count()
         });
}