Использование Linq to Entity Framework для запуска запроса на возврат большой иерархии - PullRequest
0 голосов
/ 15 декабря 2011

Второй вопрос, который мне пришлось задать о 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;
 }

Что не так с моим запросом, что мне нужно сделать это?

1 Ответ

0 голосов
/ 15 декабря 2011

Это должно помочь вам: http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/0877f2f3-32d4-43cd-bd13-90e6c2840e34 Вы также можете взглянуть на CreateSourceQuery, если это не решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...