c# - framework - operaciones basicas de linq
¿Cómo se construye una consulta LINQ a entidades para cargar objetos secundarios directamente, en lugar de llamar a una propiedad de referencia o cargar() (3)
AFAIK, para Silverlight (servicios de dominio) agregar el atributo [Incluir] al lugar correcto (sobre la propiedad de navegación en los metadatos) es suficiente https://stackoverflow.com/a/5332188/413032
Soy nuevo en el uso de LINQ to Entities (o Entity Framework como lo llamen) y estoy escribiendo un montón de código como este:
var item = (from InventoryItem item in db.Inventory
where item.ID == id
select item).First<InventoryItem>();
y luego llamar a métodos sobre ese objeto de esta manera:
var type = item.ItemTypeReference;
o
var orders = item.OrderLineItems.Load();
para recuperar objetos secundarios o relacionados.
No he perfilado el DB ni he profundizado demasiado, pero creo que cuando llamo a .Load () o a * Propiedad de referencia, en realidad estoy haciendo otra llamada al DB. Si este es el caso, ¿hay alguna forma de obtener esos objetos en mi expresión LINQ inicial?
Además de la respuesta de Robert, es posible que desee verificar esta pregunta para conocer las opciones de un método de extensión que le permita .Include () usar una expresión en lugar de una cadena, de modo que obtenga la verificación del tiempo de compilación:
Entity Framework .Include () con comprobación de tiempo de compilación?
Desea utilizar las referencias al método .Include (cadena) en este artículo "Dar forma a los resultados de la consulta" .
var item = from InventoryItem item in
db.Inventory.Include("ItemTypeReference").Include("OrderLineItems")
where item.ID == id
select item;
Probablemente también haya una sintaxis de estilo "sql" para el Includes.
También vea este artículo acerca de pasar de LINQ-a-SQL a LINQ-a-Entidades.
Para otros que buscan una solución a este problema para Linq a SQL, usted debe hacer lo siguiente (Sustituir DataContext y otros tipos para lo que sea que tenga):
using (DataContext db = new DataContext())
{
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<InventoryItem>(ii => ii.ItemTypeReference);
options.LoadWith<InventoryItem>(ii => ii.OrderLineItems);
db.LoadOptions = options;
var item = from InventoryItem item in db.Inventory
where item.ID == id
select item;
}
Esto cargará las propiedades especificadas en LoadWith siempre que se cargue el elemento principal (InventoryItem), para ese contexto particular.
En respuesta a algunas preguntas adicionales de James y Jesper, mira esta pregunta