2011-02-11 32 views
5

Estamos investigando el marco de la entidad para ver si cumple con nuestras necesidades particulares. Aquí está el escenario que me interesa:proyecciones de Entity Framework

Tengo una gran tabla (llamémosla VeryWideRecord) que tiene muchas columnas, y tiene un objeto comercial correspondiente (también se llama VeryWideRecord). Me gustaría poder consultar en mi base de datos un objeto comercial VeryWideRecord, pero solo tengo valores para ciertas columnas devueltas por el SQL subyacente. ¿Puedo hacer esto con Entity Framework?

No estoy seguro de si esto podría hacerse con la característica de división de tablas de Entity Framework, porque la aplicación necesita poder (en tiempo de ejecución) cambiar las columnas que se solicitan. La razón de esto es que estamos tratando de minimizar la cantidad de información que está cruzando el cable.

Veo cómo podría hacerse esto usando NHibernate (example), pero ¿cómo puedo hacer esto con Entity Framework?

Respuesta

0

Algo como esto (en VB.NET:.

Dim pl As New List(Of VeryWideRecord)(
    (From p In db.VeryWideRecords 
     Select New With {.RecID = p.RecID} 
    ).ToList().Select(
     Function(r) 
     Return New VeryWideRecord With {.RecID = r.RecID} 
     End Function)) 

Con esto usted tiene algún tiempo de compilación comprobación Pero si usted quiere hacer esto realmente dinámica, es eSQL quizás más adecuado. Y además, no es realmente el Entity Framework, sino la expresión lambda que hace el truco.

+0

Iba a sugerir el pr Ojection como lo hizo, pero la pregunta estableció que las columnas solicitadas se determinarán en tiempo de ejecución, no en tiempo de compilación. Además, para su información, puede hacer que EF haga el trabajo del proyecto, simplemente no querrá llamar a 'ToList()' y la proyección debería devolver un tipo anónimo. Debe tenerse en cuenta que existen limitaciones a lo que puede hacer en una proyección manejada por EF (generalmente no puede llamar funciones dentro de la proyección). En el caso de hacer la proyección sin EF, entonces se prefiere utilizar 'AsEnumerable()' sobre 'ToList()' –

+0

De acuerdo, AsEnumerable() sería mejor, pero es más un ejemplo para mostrar la parte lambda para crear el record. En cuanto a devolver un tipo Anynomous, eso es lo que él no quería. – MarcelDevG