visual studio net ejemplos linq linq-to-sql eager-loading

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:

  1. Abordar este problema de manera incorrecta.
  2. ¿Tiene la opción de llamar a un procedimiento almacenado?
  3. ¿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.