Как правильно использовать .Distinct()
В моей бд есть таблицы с животными, работниками и содержанием животных. Написал рабочий запрос sql, который выводит вид животных, с которыми работают больше всего сотрудников. В данном случаее три млекопитающих с которыми работает один и тот же сотрудник, и две птицы с которыми работают два разных сотрудника(запрос выводит птиц).
SELECT TOP(1) Species as MaxGroup, Count(DISTINCT Employees_Id) as QuantityOfEmployees
FROM
Animal1 INNER JOIN Maintenance
ON Animal1.Id = Maintenance.Animal_Id
GROUP BY Species
ORDER BY QuantityOfEmployees DESC
Я попробовал написать аналогичный запрос используя LINQ, но .Distinct() вызывает исключение. Без него работает, но поскольку считаются не только уникальные работники, запрос выводит млекопитающих. Замена QuantityOfEmployees = g.Distinct().Count(p => p.Maintenance.EmployeesId != null) на QuantityOfEmployees = g.Select(p => p.Maintenance.EmployeesId != null).Distinct().Count()не помогает.
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
namespace lab3
{
class Program
{
static void Main(string[] args)
{
using (tryContext db = new tryContext())
{
var a =
(from Maintenance in db.Maintenances
group new { Maintenance.Animal, Maintenance } by new
{
Maintenance.Animal.Species
} into g
orderby
g.Count(p => p.Maintenance.EmployeesId != null) descending
select new
{
MaxGroup = g.Key.Species,
QuantityOfEmployees = g.Distinct().Count(p => p.Maintenance.EmployeesId != null)
}
).Take(1);
foreach (var o in a)
{
Console.WriteLine($"{o.MaxGroup} ");
}
}
Console.ReadKey();
}
}
}
Ответы (1 шт):
Начиная с EF Core 5, g.Select(field).Distinct().Count() будет транслироваться в COUNT(DISTINCT field)
var query =
from Maintenance in db.Maintenances
group Maintenance by Maintenance.Animal.Species into g
select new
{
MaxGroup = g.Key,
QuantityOfEmployees = g.Select(p => p.EmployeesId).Distinct().Count()
}
query = query
.OrderBy(x = x.QuantityOfEmployees)
.Take(1);