簡體   English   中英

具有聯接和多個計數的C#LINQ查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM