LINQ聚合多个表

时间:2016-09-13 16:01:50

标签: c# entity-framework linq

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

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

我希望得到像这样的输出

CompanyName #Employees #Contractors
abc           0             10
xyz           25            999

我试图避免做两个查询,一个是让承包商,一个是让员工然后合并。有没有办法一次完成它?

n.b。我有

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

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

2 个答案:

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

答案 1 :(得分: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()
         });
}