Подтвердить что ты не робот

Как обеспечить загрузку данных о родстве с использованием LINQ to SQL?

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

            Parent
    Child1          Child2
Grandchild1

Родительский > Child1 - отношение "один ко многим"

Child1 > Grandchild1 - это отношение одно-к-n (где n равно нулю до бесконечности)

Родительский > Child2 - это однонаправленное (где n от нуля до бесконечности)

Я могу загружать данные Parent, 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 to SQL и объединении наборов результатов (не очень), однако при доступе к данным sibling он лениво загружен в любом случае.

Добавление параметра загрузки дочернего узла будет выдавать запрос 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 to SQL, чтобы присоединиться ко всем данным в надежде, что он захочет загрузить данные, однако при доступе к LINQ to SQL EntitySet из Child2 или Grandchild1 он ленивы загружает данные.

Причина возврата IList <Child1 > заключается в гидратации бизнес-объектов.

Мои мысли - это я:

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

Любая помощь очень ценится.

Спасибо,

-Скотт

4b9b3361

Ответ 1

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

Ответ 2

var children2 = from child2 in dataContext.Child2
                where children.Any(c1 => c1.Parent == child2.Parent)
                select child2;

Должно возникнуть однопользовательский запрос, поэтому он будет иметь два запроса.