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;}
}
所以我可以使用这种类型的集合作为结果
如果您已经定义了导航属性(如果您还没有定义导航属性,现在可能是这样做的好时机),那么查询应该非常简单:
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()
});
}