studio - ¿Cómo puedo cargar datos de hermanos usando LINQ to SQL?
linq vb.net datatable (2)
El objetivo es emitir la menor cantidad de consultas a SQL Server usando LINQ to SQL sin usar tipos anónimos. El tipo de retorno para el método deberá ser IList <Child1>. Las relaciones son las siguientes:
Parent
Child1 Child2
Grandchild1
Parent> Child1 es una relación de uno a muchos
Child1> Grandchild1 es una relación de uno a n (donde n es cero hasta el infinito)
Parent> Child2 es una relación de uno a n (donde n es cero hasta el infinito)
Soy capaz de cargar ansiosamente los datos de Parent, Child1 y Grandchild1 que dan como resultado una consulta a SQL Server.
Esta consulta con opciones de carga eager carga todos los datos, excepto los datos de hermanos (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;
Necesito cargar los datos de hermanos también. Un enfoque que he intentado es dividir la consulta en dos consultas LINQ a SQL y fusionar los conjuntos de resultados (no son bonitos), sin embargo, al acceder a los datos de los hermanos, de todos modos se carga de forma perezosa.
Agregar la opción de carga de hermanos emitirá una consulta a SQL Server para cada registro de Grandchild1 y Child2 (que es exactamente lo que estoy tratando de evitar):
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
También escribí consultas de LINQ to SQL para unirlos a todos los datos con la esperanza de que cargaría los datos, sin embargo, cuando se accede al EntitySet de Child2 o Grandchild1 de LINQ to SQL, la carga perezosa de los datos.
El motivo para devolver el <Child1> IList es para hidratar los objetos comerciales.
Mis pensamientos son que yo soy:
- Abordar este problema de manera incorrecta.
- ¿Tiene la opción de llamar a un procedimiento almacenado?
- ¿Mi organización no debería usar LINQ to SQL como ORM?
Cualquier ayuda es muy apreciada.
Gracias,
-Scott
Lo que debe ser correcto, debe agregar este dataContext.DeferredLoadingEnabled = false;
además de las LoadOptions que ya está configurando.
var children2 = from child2 in dataContext.Child2
where children.Any(c1 => c1.Parent == child2.Parent)
select child2;
En caso de que exista una única consulta existente, por lo que terminarán siendo dos consultas.