我有以下数据库。公司列表。每家公司都有多名员工和多个承包商。
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;}
}
所以我可以使用这种类型的集合作为结果
答案 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()
});
}