¿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 ()

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(); 

y luego llamar a los 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?

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 syntax 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(ii => ii.ItemTypeReference); options.LoadWith(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

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, para que pueda obtener la verificación del tiempo de comstackción:

Entity Framework .Include () con comprobación de tiempo de comstackción?

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