Es posible cargar una entidad, excepto algunas propiedades? Uno de esta entidad propiedades es caro para seleccionar. Me gustaría carga perezosa esta propiedad. Es eso posible?

InformationsquelleAutor | 2010-07-18

4 Comentarios

  1. 36

    Ahora que usted ha leído todo el mundo la respuesta, voy a dar la respuesta correcta. EF no admite la carga diferida de propiedades. Sin embargo, no apoyar a un concepto poderoso que esto. Se llama tabla de la división donde se puede asignar una mesa a dos entidades. Decir que un producto de la tabla en la base de datos pueden ser asignados a los productos de la entidad y ProductDetail entidad. A continuación, puede mover la cara campos a la ProductDetail entidad y, a continuación, cree un 1..1 de la asociación entre el producto y productdetail entidad. Usted puede, a continuación, cargue el productdetail asociación sólo cuando lo necesite.
    En mi rendimiento capítulo de mi libro, tengo una receta llamada.
    13-9. Mover una Costosa Propiedad a Otra Entidad

    Espero que ayude!

    Julie Lerman tiene un artículo sobre cómo dividir una tabla

    • Gracias. Voy a tener que hacer esto. Pero EF4 debe admitir la carga diferida en propiedades escalares, puede ser realmente útil.
    • Sé que el equipo está trabajando en el apoyo fuera de la caja de carga diferida propiedades en la próxima versión, pero sí creo en movimiento caro columnas a otra entidad abre vías para el retraso en la carga de varias propiedades caras a la vez. Imagine que usted tiene un empleado con objeto de EmployeePicture y employeedescription que son caros y que quieren retrasar la carga tanto de ellos, pero cada vez que quiero cargar, desea cargar juntos. Esto es algo que no se puede hacer en linq to sql.
    • Sí, si hay más de un campo costoso, en este caso el equipo EF puede activar un indicador como LoadAllLazyProperties que permite EF cargar todos los escalares propiedades marcadas como la Carga Perezosa juntos, cuando alguno de ellos se solicita. Esta mejora de las situaciones como la que usted menciona, sin separarse EntityTypes!!
  2. 6

    Con una propiedad escalar, la única manera de forma selectiva no carga una cierta propiedad es el proyecto en ESQL o L2E:

    var q = from p in Context.People
            select new
            {
                Id = p.Id,
                Name = p.Name //note no Biography
            };

    +1 Dan, haciendo de este perezosamente es peor que la carga es frontal. Si desea controlar la carga, ser explícito.

    • Gracias por esta sugerencia. Sí, pero esta proyección no es eficiente. En primer lugar, que el resultado sería un tipo anónimo que no pueden ser utilizados como directamente a las Personas. Un Pueblo nuevo objeto tiene que ser creado y se crean instancias correctamente, que será pérdida de tiempo de análisis entre los objetos. Este tipo de no ser objeto de control, ya sea por el contexto.
    • usted prematuramente la optimización.
  3. 1

    stimms es correcta, pero tenga cuidado al utilizar la carga diferida. Usted puede tener problemas de rendimiento y no se dan cuenta de que la propiedad es llegar cargado en una ubicación específica en el código. Esto es debido a que las cargas de los datos cuando se utiliza la propiedad

    Yo prefiero usar la carga explícita. De esta manera usted sabe que cuando se cargan y donde. He aquí un enlace que da un ejemplo para el LoadProperty http://sankarsan.wordpress.com/2010/05/09/ado-net-entity-framework-data-loading-part-2/

    También puede usted con Ganas de Carga mediante el método Include. Ejemplo:http://wildermuth.com/2008/12/28/Caution_when_Eager_Loading_in_the_Entity_Framework

    • stimms y Dan, no me refiero a una propiedad, me estoy refiriendo a un campo (miembro de la clase) como Biografía (string en C# o varchar(1024) en SQL Server ) que es muy caro para cargar con la entidad, me gustaría perezoso de carga cuando sea necesario. Hasta donde yo sé, esto no funciona en EF4. Es allí una manera de hacerlo?
    • Usted desea tan perezoso de carga de una propiedad escalar? Justo al lado de la parte superior de mi cabeza yo podría tratar de dividir Biografía a cabo en la en la Entidad y el valor como una propiedad de navegación. Entonces yo sería capaz de perezoso/ansioso/expicit la carga. Puede haber una mejor manera…voy a probar esta teoría, cuando tengo la oportunidad.
    • Gracias, parece ser la única manera eficaz.
  4. 1

    Dado una consulta sobre un EntityFramework DbSet, donde el objetivo de entidad contiene un BigProperty y un SmallProperty,
    Cuando usted está tratando de acceder a la SmallProperty sin la carga de la BigProperty en la memoria :

    //this query loads the entire entity returned by FirstOrDefault() in memory
    //the execution is deferred during Where; the execution happens at FirstOrDefault
    db.BigEntities.Where(filter).FirstOrDefault()?.SmallProperty;
    
    //this query only loads the SmallProperty in memory
    //the execution is still deferred during Select; the execution happens at FirstOrDefault
    //a subset of properties can be selected from the entity, and only those will be loaded in memory
    db.BigEntities.Where(filter).Select(e=>e.SmallProperty).FirstOrDefault();

    Por lo tanto se podría explotar este comportamiento a la consulta sólo de la BigProperty donde realmente se necesita, y el uso de las instrucciones select explícitamente filtro a cabo en todas las demás.

    He probado con el Uso de la Memoria de la funcionalidad de la depuración de Visual Studio Herramientas de Diagnóstico.

Dejar respuesta

Please enter your comment!
Please enter your name here