Usando Incluir en Entity Framework 4 con expresiones lambda

88

He visto muchos artículos sobre cómo superar este asunto, todos relacionados con CTP4, o agregando mis propios métodos de extensión.

¿Existe una forma "oficial" incluida en EF4 de usar expresiones lambda dentro de include (tanto para las relaciones de primer nivel como para las de segundo y más nivel) o finalmente no se incluyó en el RTM?

Si hay uno, me encantaría aprender cómo hacerlo, ya que usar la expresión lambda en mi código ahora (con # system.data.entity # system.data.linq) todavía me da:

No se puede convertir la expresión lambda al tipo 'cadena' porque no es un tipo delegado en:

var customers = from c in
context.Customers.Include(c=>c.Phone)
Dani
fuente
1
no, no existe (aparte de CTP4, como dices). Utilizo métodos de extensión / enumeraciones para lograr la seguridad de tipos.
RPM 1984
Yo también hice eso, ¿así que MS lo incluyó en CTP4 y lo eliminó en RTM?
Dani

Respuestas:

229

La versión RTM de Entity Framework 4.1 en realidad incluye métodos de extensión en el EntityFramework.dllarchivo, para una carga ansiosa con lambda a través de la Includefunción. Simplemente incluya la DLL en su proyecto y debería poder escribir código como:

var princesses1 = context.Princesses.Include(p => p.Unicorns).ToList();

Recuerde agregar una instrucción Import / Using para incluir el espacio de nombres System.Data.Entity . De lo contrario, el compilador no puede encontrar los métodos de extensión. P.ej:

using System.Data.Entity;

Consulte este artículo del blog del equipo de ADO.NET para obtener más información.

cecilfilip
fuente
1
Si bien el enlace al blog de ADO.net sigue siendo relevante, la referencia / guía de EF6 para el mismo tema es: Cargando entidades relacionadas Creo que la documentación debe cambiar a los ejemplos de Princess y Unicorn en lugar del Blog y la publicación que han estado usando En todas partes.
Arkaine55
1
gracias, acabo de agregar usando System.Data.Entity; su trabajo yo.
adnan
El enlace del blog del equipo está muerto, esta es la nueva ubicación
Nintynuts
89

Aunque esto está implícito en la pregunta, para cualquier otra persona que tenga el mismo problema en el que no puede usar lambdas con .Include, asegúrese de tener esto:

using System.Data.Entity;
AaronLS
fuente
5

No, no hay soporte oficial para Incluir con expresión lambda en RTM en este momento. Estoy usando esto .

Cuando hablamos de CTP4 nos referimos a Entity Framework Feature. Es una API más nueva que EF4. Incluye principalmente Code First y algunas otras mejoras.

Ladislav Mrnka
fuente
¿Alguna idea de cuándo admitirá MS esta función? Entiendo que todos estos métodos de extensión tienen un problema de rendimiento con el objeto grande / multinivel, ya que necesitan recorrer una y otra vez cada llamada para incluir, y aunque el árbol de "definición" del objeto es constante y se puede almacenar en caché, no hay una solución como esto todavía.
Dani
Entity Framework Feature se encuentra actualmente en CTP5. Supongo que la versión RTM debería publicarse en el primer trimestre de 2011. Así que, con suerte, contendrá Incluir con expresión lambda, pero aún no he comprobado su implementación, por lo que no puedo decir si utiliza algún tipo de almacenamiento en caché.
Ladislav Mrnka
31
Esta respuesta es incorrecta a partir de EF 4.3.x. Las otras respuestas son correctas, uno debe usar System.Data.Entity para obtener la sobrecarga con expresiones lamda.
Eric J.
1
@EricJ: Sí. Incluir fuertemente tipado está disponible desde EF 4.1.
Ladislav Mrnka