Следующий фрагмент работает для того, что мне нужно.Хотя я верю, что должна быть лучшая практика?Более оптимальный способ сделать этот запрос?
Необходимо получить список объектов сотрудников, которые являются прямыми отчетами для сотрудников / мг х.Прямые отчеты заносятся в таблицу истории, в которой есть несколько записей для каждого сотрудника, поэтому из этой таблицы следует возвращать только одну (самую последнюю) запись для каждого прямого отчета (сотрудника), а затем использовать таблицу Employee для полученияобъект сотрудника, где идентификатор сотрудника равен идентификатору сотрудника из каждой записи истории в этом отфильтрованном наборе результатов.Я могу получить обе половинки с двумя отдельными запросами LINQ to EF.
Проблема возникает при попытке присоединиться к объекту employeeHistory из первого набора результатов.Согласно MSDN: ссылка на нескалярные замыкания не поддерживается [Ссылка на нескалярное замыкание, такое как объект, в запросе не поддерживается.Когда такой запрос выполняется, генерируется исключение NotSupportedException с сообщением, в котором говорится: «Невозможно создать постоянное значение типа« Тип закрытия ». В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid»).. "]
Итак, я запускаю два запроса и создаю первый список типа int, а не сложный объект.Это работает, но кажется надуманным.Любые предложения относительно лучшего способа (я хотел бы сделать один запрос).
private List<BO.Employee> ListDirectReports(int mgrId)
{
IQueryable<BO.Employee> directRpts;
using(var ctx = new Entities())
{
//to get a list of direct rpts we perform two separate queries. linq to ef with linq to objects
//first one gets a list of emp ids for a direct mgr emp id from the history table
//this first qry uses grouping and a filter by empid and a filter by max(date)
//the second qry joins to the resultset from the first and goes to the employee table
//to get whole employee objects for everyone in the int emp id list from qry #1
//qry #1: just a list of integers (emp ids for those reporting to emp id of mgrId)
IEnumerable<int> directRptIDList =
from employeeHistory in ctx.EmployeeHistory
.Where(h => h.DirectManagerEmployeeID == mgrId).ToList()
group employeeHistory by employeeHistory.EmployeeID into grp
let maxDt = grp.Max(g => g.DateLastUpdated) from history in grp
where history.DateLastUpdated == maxDt
select history.EmployeeID;
//qry #2: a list of Employee objects from the Employee entity. filtered by results from qry #1:
directRpts = from emp in ctx.Employee
join directRptHist in directRptIDList.ToList()
on emp.EmployeeID equals directRptHist
select emp;
}
return directRpts.ToList();
}
Спасибо.