.net - usar - programación linq con visual c#
Linq a Sql-Cargando entidades secundarias sin usar DataLoadOptions? (7)
¿Es posible cargar entidades secundarias en una sola consulta sin utilizar DataLoadOptions?
Estoy usando un contexto de datos por solicitud en una aplicación web asp.net y trato de evitar la limitación de linq a sql de no poder cambiar dataloadoptions una vez que se ha ejecutado una consulta.
Gracias.
¿Qué hay de las uniones? P.ej:
from a in Albums join o in Users on a.Owner equals o select new {a, o}
Las entidades secundarias se cargarán cuando accedas a ellas por primera vez, por lo que puedes forzar a Linq a Sql para que las cargue accediendo a ellas ... :-) Pero no creo que sea eso en lo que estabas pensando.
¿Cuál es tu situación? ¿Tiene entidades secundarias almacenadas en la misma tabla que la entidad principal y quiere buscarlas todas con una sola consulta?
Si su colección es un EntitySet , puede cargarla con el método .Load ():
Person p = ctx.Persons.First();
p.Addresses.Load();
Si no te importa el enlace al contexto de datos, como dices que no, podrías escribir un procedimiento almacenado que arroje resultados múltiples que se correlacionen con tus objetos. Lea más sobre esto aquí .
Encontré el siguiente ejemplo de vb.net que completa manualmente las entidades secundarias de un tipo de resultados múltiples:
Public Function GetSubjectsWithBooks() As List(Of Subject)
Dim results As IMultipleResults = Me.GetSubjectAndBooks
Dim Subjects = results.GetResult(Of Subject).ToList
Dim Books = results.GetResult(Of Book).ToList
For Each s In Subjects
Dim thisId As Guid = s.ID
s.FetchedBooks = (From b In Books Where b.SubjectId = thisId).ToList
Next
Return Subjects
End Function
Esto fue tomado de un proyecto de muestra escrito por Jim Wooley (uno de los autores de Link in Action) que se puede encontrar en: http://www.thinqlinq.com/Downloads/LinqToSqlBeyondTheBasics.zip
Omer, ¿esta es la técnica a la que te refieres?
El blog de Rob Conery tiene una manera de hacerlo usando una clase auxiliar que tiene, LazyList<T>
. También usa objetos personalizados para evitar el problema de unirse al tipo anónimo. Lo he usado con éxito para obtener relaciones padre-hijo desde sql sin DataLoadOptions.
Creo que lo cubre en Pt2 o Pt3 de sus videos de MVC Storefront:
http://www.asp.net/learn/mvc-videos/video-351.aspx
http://www.asp.net/learn/mvc-videos/video-352.aspx
Esto supone que tiene POCO llamado Categoría (no entidad linq) y una clase LazyList:
var categories = (from c in _db.Categories
select new Category
{
CategoryID = c.CategoryID,
CategoryName = c.CategoryName,
ParentCategoryID = c.ParentCategoryID,
SubCategories = new LazyList<Category>(
from sc in _db.Categories
where sc.ParentCategoryID == c.CategoryID
select new Category
{
CategoryID = sc.CategoryID,
CategoryName = sc.CategoryName,
ParentCategoryID = sc.ParentCategoryID
})
});
Use Incluir ...
var q = from u en context.Users.Include ("dirección") ...
Causaría que el objeto hijo de la dirección también se rellenara.