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)

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.


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;

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.


¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.