Как к нетерпеливым одноуровневым данным загрузки с помощью LINQ для SQL?

Цель состоит в том, чтобы выпустить наименьшее количество запросов к SQL Server с помощью LINQ для SQL, не используя анонимные типы. Тип возврата для метода должен будет быть IList <Child1>. Отношения следующие:

            Parent
    Child1          Child2
Grandchild1

Родитель> Child1 является связью "один ко многим"

Child1> Grandchild1 является one-to-n отношениями (где n является нулем к бесконечности),

Родитель> Child2 является one-to-n отношениями (где n является нулем к бесконечности),

Я могу к нетерпеливой загрузке Родитель, Child1 и данные Grandchild1, приводящие к одному запросу к SQL Server.

Этот запрос с опциями загрузки нетерпеливые загрузки все данные, кроме одноуровневых данных (Child2):

DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<Child1>(o => o.GrandChild1List);
loadOptions.LoadWith<Child1>(o => o.Parent);

dataContext.LoadOptions = loadOptions;

IQueryable<Child1> children = from child in dataContext.Child1
                                select child;

Я должен загрузить одноуровневые данные также. Один подход, который я попробовал, разделяет запрос на два LINQ к SQL-запросам и объединяет наборы результатов вместе (не симпатичный), однако после доступа к одноуровневым данным, это лениво загруженный так или иначе.

Добавление одноуровневой опции загрузки выпустит запрос к SQL Server для каждой записи Grandchild1 и Child2 (который является точно, чего я стараюсь избегать):

DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<Child1>(o => o.GrandChild1List);
loadOptions.LoadWith<Child1>(o => o.Parent);
loadOptions.LoadWith<Parent>(o => o.Child2List);

dataContext.LoadOptions = loadOptions;

IQueryable<Child1> children = from child in dataContext.Child1
                                select child;


exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0]
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=1

exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0]
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=2

exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0]
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=3

exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0]
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=4

Я также записал LINQ в SQL-запросы для участия во всех данных в надеждах, что он был бы нетерпеливая загрузка данные, однако когда к LINQ к SQL EntitySet Child2 или Grandchild1 получают доступ он ленивые загрузки данные.

Причина возврата IList <Child1> состоит в том, чтобы гидратировать бизнес-объекты.

Мои мысли, я также:

  1. Приближение к этой проблеме неправильный путь.
  2. Имеет опция вызова хранимой процедуры?
  3. Моя организация не должна использовать LINQ для SQL как ORM?

Любая справка значительно ценится.

Спасибо,

- Scott

16
задан Scott 30 March 2010 в 15:01
поделиться

2 ответа

То, что у вас должно быть правильным, вам нужно добавить этот dataContext.DeferredLoadingEnabled = false; в дополнение к LoadOptions, которое вы уже используете параметр.

14
ответ дан 30 November 2019 в 22:55
поделиться
var children2 = from child2 in dataContext.Child2
                where children.Any(c1 => c1.Parent == child2.Parent)
                select child2;

Должен привести к единственному запросу, так что в итоге получится два запроса.

0
ответ дан 30 November 2019 в 22:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: