[Introduction to EF] - Problem {5} - Departments with more than 5 employees - Въпрос относно авторското решение.
В авторското решение на задачата забелязах две неща, които (според това което аз съм чел) са супер грешни.
- Заявката се присвоява на променлива от тип IEnumerable.
По правило не трябва ли винаги да се работи с IQueryable? Така заявката, която се изпраща към базата е доста по оптимизирана, защото се възползваме от Linq-to-Entities. И по-важно, Extension методите изглеждат същите, но не са. Методите върху IEnumerable, очакват като параметър Func<нещо си>, докато при IQueryable очакват Expression<Func<нещо си>>. Няма нужда да се обяснява, че разликата е огромна.
- Вътрешният Foreach итерира по department.Employees.
Няма ли опасност да се стигне до т. нар. "Select N + 1" проблем? Накратко - ще се генерира една заявка за департамента и след това по една за всеки служител в него, което не е готино от гледна точка на performance.
Не е ли по добър вариантът:var departments = db.Departments .Where(d => d.Employees.Count > 5) .OrderBy(d => d.Employees.Count) .Select(d => new { Name = d.Name, Manager = d.Employee.FirstName, DepEmployees = d.Employees }); foreach (var department in departments) { Console.WriteLine($"{department.Name} {department.Manager}"); var employees = department.DepEmployees; foreach (var employee in employees) // ......
Ако някой с по-дълбоки познания по EF разясни дали наистина е така или пък аз се бъркам - ще е супер.