Entity Framework - Выберите с или без отношений - PullRequest
0 голосов
/ 08 июня 2011

Если у меня есть набор таблиц, TableA, TableB, TableC и TableD, где TableA имеет отношения один ко многим с TableB, TableC и TableD.

Иногда я хочу вернуть весь набор таблиц TableA, TableB, TableC и TableD. Иногда я хочу вернуть только Таблицу А.

На данный момент у меня есть следующее:

TableA tableA;

if (includeRelationships)
{
    tableA = (from a in context.TableAs
                   .Include("TableBs")
                   .Include("TableCs")
                   .Include("TableDs")
              where a.Id = myId
              select a).SingleOrDefault();
}
else
{
    tableA = (from a in context.TableAs
              where a.Id = myId
              select a).SingleOrDefault();
}

// do stuff with tableA

Это единственный способ сделать это?

РЕДАКТИРОВАТЬ - Уточнение после ответа feanz:

Это будет отображаться как служба WCF, поэтому это должен быть один вызов БД, либо всех таблиц, либо одного TableA, поэтому отложенная / отложенная загрузка не подходит.

Ответы [ 3 ]

0 голосов
/ 06 сентября 2012

использование

context.ContextOptions.LazyLoadingEnabled = true;
0 голосов
/ 06 сентября 2012

Сделайте что-то вроде этого

var query = context.TableA;
if (includeRelationships) 
{
   query = query.Include("Tableb").Include("TableC").Include("TableD");
}
var tablea = query.SingleOrDefault();

В этом случае вы используете тот факт, что метод расширения «Включить» принимает и возвращает IQueryable.Возможно, вы захотите использовать перегрузку:

query.Include(x => x.TableB)...

метода, который принимает выражение в качестве параметра.Таким образом, компилятор сделает проверку за вас.У вас может не быть доступа к нему, если вы используете старую версию EF.

0 голосов
/ 08 июня 2011

Becasue EF Support Ленивая загрузка по умолчанию во втором примере:

 tableA = (from a in context.TableAs
          where a.Id = myId
          select a).SingleOrDefault();

Все еще будет иметь TableBs, TableCs и TableDs в качестве параметров, к которым вы можете получить доступ.При первом обращении к этим параметрам EF должен запустить запрос, чтобы получить соответствующую информацию.Это может быть просто проблемой и связано с проблемами N + 1, однако в некоторых ситуациях желательно, поскольку, как вы упомянули, вы можете не всегда получать данные.

EF Ленивая загрузка информации

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