[英]C# LINQ query with joins and multiple counts
我需要將此SQL查詢轉換為Linq-Entity查詢
SELECT Company.name, COUNT(DISTINCT User.id), COUNT(DISTINCT Office.id)
FROM Company
INNER JOIN Office ON Company.id = Office.companyId
INNER JOIN Employee ON Office.id = Employee.officeId
GROUP BY Company.name
因此,我想要一個能夠給我一個公司名稱,唯一雇員人數和一行辦公室人數的結果。
我有這些實體
public class Company
{
public int id { get; set; }
public string name { get; set; }
public List<Office> offices { get; set; }
}
public class Office
{
public int id { get; set; }
public string name { get; set; }
public int companyId { get; set; }
public List<Employee> employees { get; set; }
}
public class Employee
{
public int id { get; set; }
public string name { get; set; }
public int officeId { get; set; }
}
和ViewModel:
public class MyViewModel
{
public Company company { get; set; }
public int employeeCount { get; set; }
public int officeCount { get; set; }
}
我在控制器中一直嘗試的操作:
var viewModel =
from c in _context.Companies
join o in _context.Offices on c.id equals o.companyId
join e in _context.Employees on o.id equals e.officeId
select new MyViewModel { company = c, employeeCount = ??, officeCount =
??}
return View(viewModel);
所以我不知道count()和group by如何工作。
首先,LINQ沒有SQL COUNT(DISTINCT expr)
構造的直接等效項。
其次,更重要的是,在LINQ to Entities中,您不需要遵循SQL規則。 我們不使用聯接,而是使用導航屬性,基本上像使用對象一樣編寫查詢,然后讓EF將其轉換為SQL。
有問題的LINQ to Entities查詢是自然而簡單的,因為:
var query = _context.Companies
.Select(c => new MyViewModel
{
company = c,
officeCount = c.offices.Count(),
employeeCount = c.offices.Sum(o => o.employees.Count()),
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.