Цель состоит в том, чтобы выпустить наименьшее количество запросов к 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> состоит в том, чтобы гидратировать бизнес-объекты.
Мои мысли, я также:
Любая справка значительно ценится.
Спасибо,
- Scott
То, что у вас должно быть правильным, вам нужно добавить этот dataContext.DeferredLoadingEnabled = false;
в дополнение к LoadOptions, которое вы уже используете параметр.
var children2 = from child2 in dataContext.Child2
where children.Any(c1 => c1.Parent == child2.Parent)
select child2;
Должен привести к единственному запросу, так что в итоге получится два запроса.