ADO.NET Entity Framework - Как выбрать данные только из одной таблицы (и игнорировать другие таблицы)? - PullRequest
0 голосов
/ 15 марта 2011

Background - команда, в которой я только что начал использовать EntityFramework;сначала мы спроектировали базу данных, поместили все связи таблиц на место, внешние ключи и т. д .;Затем через Visual Studio добавьте новую модель данных сущности ADO.NET, и мы автоматически получим сгенерированный файл edmx, представляющий всю базу данных!

Теперь я сосредоточусь на двух таблицах, которые предоставляют данные для всех раскрывающихся списков и списков поиска.;

TLookupDomain (domainID, domainName, domainDesc )

TLookup (lookupID, domainID, lookupCode, lookupDisplay, lookupDesc, sortOrder)

Отношение 1-M происходит слева направо:

TLookupDomain -

ИтакlookupID является внешним ключом для 30 таблиц;

IQueryable<TLookup> qList = from l in ctx.TLookups
                            where l.domainID == 24
                            select l;
foreach (TLookup l in qList)
{
   //do something.
   System.Diagnostics.Debug.WriteLine("{0}\t{1}", l.lookupCode, l.lookupDisplay);
   foreach (TOther f in l.TOthers)
   {
      System.Diagnostics.Debug.WriteLine("{0}\t{1}", f.feeAmount, f.feeDesc);
   }
}

Когда я выполняю вышеуказанный LINQ, я получаю все поля для таблицы TLookup (что справедливо), но данные также выбираются для30 или около того таблиц, которые связаны с ним, хотя я НЕ заинтересован в данных другой таблицы на данный момент, и я собираюсь отбросить все данные, как только LINQ их получит.

Два вопроса, которые у меня есть:Q.1) Могу ли я как-то изменить запрос LINQ выше или сказать EntityFramework, иначе не беспокоить выборки данных из 30 других связанных таблиц?

Q.2) "правильно" иметь один файл edmx, которыймоДелс всю базу данных?(звучит для меня изворотливо).

Ответы [ 2 ]

1 голос
/ 15 марта 2011

Запросы Linq-to-Entities ничего не выбирают автоматически.Извлечение навигационных свойств выполняется либо с нетерпением, либо с отложенной загрузкой.Вы не используете нетерпеливую загрузку, потому что для этого требуется вызвать Include в запросе (или ctx.LoadProperty отдельно).Так что, если ваши данные извлекаются, это должно быть из-за отложенной загрузки, которая включена по умолчанию.Ленивая загрузка запускается, когда вы получаете доступ к свойству навигации в коде.

Вы также можете возвращать только те данные, которые вам нужны, с помощью проекций.Примерно так должны возвращаться данные только для чтения:

var query = from l in ctx.TLookups
            where l.domainId == 24
            select new 
              {
                l.lookupCode,
                l.lookupDisplay,
                l.TOthers
              };

Наличие одного или нескольких EDMX является распространенной дилеммой.Работа с одним EDMX делает все проще.Если вы хотите знать, как использовать несколько EDMX и делиться концептуальными определениями, проверьте эти две статьи: Часть 1 , Часть 2 .

1 голос
/ 15 марта 2011

Сконфигурируйте Lazy Load на true для модели.Отношения должны быть загружены только после наступления.Вы также можете разделить модели, чтобы избежать слишком большого количества ненужных отношений.

...