2016-09-13 72 views
1

我有以下数据库。公司名单。每家公司都有多名员工和多个承包商。LINQ聚合多个表

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

我想输出像这样

CompanyName #Employees #Contractors 
abc   0    10 
xyz   25   999 

我试图避免做2个查询,一个让承包商和一个让员工,然后将它们合并。有办法一次完成它吗?

n.b.我有

class CompanySummary{ 
string Name {get; set;} 
int EmpCount {get; set;} 
int ConCount {get; set;} 
} 

这样我就可以使用这种类型的集合作为结果

+0

为什么你不使用连接这个? –

回答

2

如果定义导航属性(如果你还没有,可能是做到这一点的好时机) ,查询应该是很简单的:

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查询。

0

如果您正在使用Entity Framework与数据库进行通信并使表与外键链接,则可以在一个查询中执行此操作。它看起来像这样:

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() 
     }); 
}