Цель состоит в том, чтобы выдавать наименьшие запросы 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?
Любая помощь очень ценится.
Спасибо,
-Скотт