C # LINQ запрос с объединениями и несколькими счетчиками - PullRequest
0 голосов
/ 01 июня 2018

Мне нужно перевести этот 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.

1 Ответ

0 голосов
/ 01 июня 2018

Во-первых, 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()),
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...