Я пытаюсь оптимизировать свои EF-запросы.У меня есть объект под названием Сотрудник.У каждого сотрудника есть список инструментов.В конечном счете, я пытаюсь получить список сотрудников с их инструментами, которые НЕ сломаны.При выполнении моего запроса я вижу, что на сервер делается ДВА вызова: один для сущностей сотрудников и один для списка инструментов.Опять же, я пытаюсь оптимизировать запрос, поэтому сервер получает запрос только один раз.Как я могу это сделать?
Я изучал с помощью LINQ join и как создать LEFT JOIN, но запрос все еще не оптимизирован.
В моем первом блоке кода здесьрезультат - это то, чего я хочу, но - опять же - есть два попадания на сервер.
public class Employee
{
public int EmployeeId { get; set; }
public List<Tool> Tools { get; set; } = new List<Tool>();
...
}
public class Tool
{
public int ToolId { get; set; }
public bool IsBroken { get; set; } = false;
public Employee Employee { get; set; }
public int EmployeeId { get; set; }
...
}
var x = (from e in db.Employees.Include(e => e.Tools)
select new Employee()
{
EmployeeId = e.EmployeeId,
Tools = e.Tools.Where(t => !t.IsBroken).ToList()
}).ToList();
Этот второй блок кода имитирует то, что я пытаюсь выполнить.Тем не менее, GroupBy (...) оценивается локально на клиентском компьютере.
(from e in db.Employees
join t in db.Tools.GroupBy(tool => tool.EmployeeId) on e.EmployeeId equals t.Key into empTool
from et in empTool.DefaultIfEmpty()
select new Employee()
{
EmployeeId = e.EmployeeId,
Tools = et != null ? et.Where(t => !t.IsBroken).ToList() : null
}).ToList();
В любом случае, я могу сделать ОДИН вызов на сервер, а также не выполнять мою оценку GroupBy () локальнои вернет ли он список сотрудников с отфильтрованным списком инструментов с инструментами, которые не сломаны?Спасибо.