Второй вопрос, который мне пришлось задать о Linq!Поэтому я признаю, что только начал использовать его, и я немного учусь в этом.Но я получил отличный ответ на свой последний запрос, так что подумал, что мне снова повезет!Я боролся с этим в основном один день!
У меня есть длинная иерархия, которую я хочу вернуть все, но в конце иерархии мне нужно, чтобы она была условной.
У меня есть такая иерархия:
Person (object) -> Party (object) -> Workers (collection)
-> WorkerOperatorAssignment (collection) -> Operator (object)
-> OperatorBusinessAssignment (collection) -> BusinessUnit (object)
Это от Person to BusinessUnit через таблицу Operator, так как я должен быть уверен, что строки Operator предназначены для этого Person, и прямо в BusinessUnit, как мне нужноУбедитесь, что Оператор также назначен BusinessUnit, но есть также более короткий маршрут от Person до BusinessUnit direct (fyi)
Person (object) -> BusinessUnits (collection)
У меня есть PersonID для первой таблицы, а также BusinessUnitID для последней таблицы.В основном мне нужно вернуть объект Person, который содержит каждую часть иерархии и все записи Operator, которые находятся в определенном BusinessUnit.
У меня пока есть этот кусок Linq, и он полностью возвращает Operator, но возвращает ВСЕ операторы в запросе, а не только те, которые имеют определенную связь с BusinessUnit.Это происходит из-за невозможности поместить предложение where в оператор Include.
var PersonQuery =
DbContext.People.Where(p => p.PersonPartyID == personPartyID)
.Include(p => p.Party.Workers.Select(w => w.WorkerOperatorAssignments.Select(a => a.Operator)));
У меня отключена отложенная загрузка, и мне нужно, чтобы это было сделано в одном запросе, если это возможно.
Как бы ограничить возвращаемых операторов, чтобы возвращались только те, которые находятся в BusinessUnit?
ОБНОВЛЕНИЕ:
Я вернулся к исходному запросу и выполнил его, какза ответ Натана.Это сложный запрос.
(from P in DbContext.People
where P.PersonPartyID == personPartyID
select new
{
PersonObject = P,
PartyObject = P.Party,
WorkerObject = P.Party.Workers.FirstOrDefault(),
BusinessUnit = P.BusinessUnits.Where(bu => bu.BusinessUnitID == businessUnitID).FirstOrDefault(),
WorkerOperatorAssignments = P.Party.Workers.SelectMany(w => w.WorkerOperatorAssignments)
.Where(a => a.Operator.OperatorBusinessUnitAssignments.Any(oa => oa.BusinessUnit.BusinessUnitID == businessUnitID)),
Operator = P.BusinessUnits.Where(bu => bu.BusinessUnitID == businessUnitID)
.SelectMany(bu => bu.OperatorBusinessUnitAssignments)
.Select(a => a.Operator)
}).SingleOrDefault();
Проблема теперь в том, что Entity Framework автоматически скрывает каждый объект для объекта Person, КРОМЕ BusinessUnit.
Итак, после этогозапрос, мне нужно сделать это:
// get the person object
if (PersonQuery != null)
{
// get the person object
Person ReturnObject = PersonQuery.PersonObject;
// now attach the business unit
ReturnObject.BusinessUnits.Add(PersonQuery.BusinessUnit);
}
else
{
return null;
}
Что не так с моим запросом, что мне нужно сделать это?