Entity Framework запрос на нескольких уровнях отношений - PullRequest
4 голосов
/ 13 мая 2011

Я только начинаю в Entity Framework и Linq To Entities и пытаюсь разобраться с запросами.

У меня есть структура данных следующим образом:

Таблицы A, B,C.

A имеет отношение «один ко многим» с B, B имеет отношение «один ко многим» с C.

Один из наших объектов представления состоит из данных из A, B & C с учетом идентификатораиз C

Итак, как я могу представить это в запросе?

Как получить объект A из запроса where c.Id == myParam?

Ответы [ 4 ]

4 голосов
/ 13 мая 2011

Как насчет:

var c = context.Cs.Include("B.A").Where(c => c.Id == myParam).SingleOrDefault();

Где B - это свойство навигации на C для экземпляра B, а A - это свойство навигации от B до экземпляра A.

Вы также можете использовать лямбда-нотацию, если восстанавливается пространство имен System.Data.Entity:

var c = context.Cs.Include(i=>i.B.A).Where(c => c.Id == myParam).SingleOrDefault();

А для свойств навигации в Собрании вы можете использовать .Select ()

var c = context.Cs.Include(i=>i.Select(j=>j.A)).Where(c => c.Id == myParam).SingleOrDefault();
3 голосов
/ 13 мая 2011

ниже работает, если вы убедитесь, что все ссылки на объект A загружены, и вы можете получить к ним доступ.

var C = lstA.Where (p => pBFirstOrDefault (). C == cID);

2 голосов
/ 13 мая 2011

Вы можете попробовать это:

var temp = from a in AList
           where a.B.All(b => b.C.All(c => c.ID== myParam))
           select a;

обратите внимание, что AList является List<A>.

0 голосов
/ 13 мая 2011

Есть много способов сделать что-то с LINQ, иногда я обнаруживаю, что если мне трудно найти решение, использующее комбинацию существующих методов расширения, я просто напишу соединение (как выбудет в sql) с помощью LINQ.Приведенное ниже соединение не требует фактической части «присоединение к», поскольку EF будет использовать ваши существующие сопоставления (навигационные свойства) для создания объединения для вас.

var query = from a in Ta
            from b in Tb
            from c in Tc
            where C.Id == myParam
            select new { A = a, B = b, C = c};

Отсюда у вас есть анонимный тип, который имеетданные из всех трех таблиц.Самое приятное то, что EF выполняет автоматическую фиксацию ваших объектов, то есть вы можете вернуть только A из вашего метода и пройти через него, чтобы получить B и C.

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