Al consultar una gran mesa donde usted necesita para acceder a las propiedades de navegación más adelante en el código (I explícitamente que no desea utilizar la carga diferida) lo que va a realizar mejor .Include() o .Load()? O ¿por qué utilizar el uno sobre el otro?

En este ejemplo el que se incluyen todas las tablas sólo tienen alrededor de 10 entradas y empleados, cerca de 200 entradas, y puede suceder que la mayoría de los que estará cargado de todos modos, se incluyen porque coinciden con la cláusula where.

Context.Measurements.Include(m => m.Product)
                    .Include(m => m.ProductVersion)
                    .Include(m => m.Line)
                    .Include(m => m.MeasureEmployee)
                    .Include(m => m.MeasurementType)
                    .Where(m => m.MeasurementTime >= DateTime.Now.AddDays(-1))
                    .ToList();

o

Context.Products.Load();
Context.ProductVersions.Load();
Context.Lines.Load();
Context.Employees.Load();
Context.MeasurementType.Load();

Context.Measurements.Where(m => m.MeasurementTime >= DateTime.Now.AddDays(-1))
                    .ToList();
InformationsquelleAutor Staeff | 2013-10-11

6 Comentarios

  1. 83

    Depende, de probar ambos

    Cuando se utiliza Include(), se obtiene la beneficio de cargar todos los datos en una sola llamada a la base de datos de la tienda. Si se trata de un Servidor SQL server remoto, por ejemplo, que puede ser una gran mejora en el rendimiento.

    La desventaja es que Include() las consultas tienden a obtener realmente complicado, especialmente si usted tiene cualquiera de los filtros (Where() llamadas, por ejemplo) o intentar hacer cualquier agrupación. EF se generan en gran medida de consultas anidadas uso de sub-SELECT y APPLY instrucciones para obtener los datos que desea. También es mucho menos eficiente — volver una sola fila de datos con todos los posibles niño-objeto de la columna, de modo que los datos para el nivel superior, los objetos se repite un montón de veces. (Por ejemplo, un solo objeto primario con 10 niños de producto de 10 filas, cada una con los mismos datos que para el padre-del objeto de columnas). He tenido solo EF a las consultas tan complejos que causó interbloqueos cuando se ejecuta en el mismo tiempo como EF lógica de actualización.

    La Load() método es mucho más simple. Cada consulta es una sola, fácil, sencillo SELECT declaración en contra de una sola tabla. Estos son mucho más fáciles de todas las maneras posibles, excepto tienes que hacer muchos de ellos (posiblemente muchas veces más). Si se han anidado las colecciones de colecciones, incluso, puede que necesite un bucle a través de su superior nivel de objetos y Load de sus sub-objetos. Se puede ir de las manos.

    Rápido regla-de-pulgar

    Intentar evitar tener cualquier más de tres Include llamadas en una sola consulta. Me parece que la EF es a las consultas demasiado feo para reconocer más allá de eso; es también coincide con mi regla-de-pulgar para las consultas de SQL Server, que hasta cuatro instrucciones JOIN en una sola consulta funciona muy bien, pero después de que es hora de considerar la refactorización.

    Sin embargo, todo eso es sólo un punto de partida.

    Depende de su esquema, su entorno, sus datos, y muchos otros factores.

    Al final, usted sólo tendrá que probarlo cada forma.

    Elige un razonable «default» patrón de uso, a ver si es lo suficientemente bueno, y si no, optimizar al gusto.

    • +1 para la toma de la conexión de red en cuenta (Si este es un Servidor SQL server remoto). Es a menudo un punto importante a tener en cuenta.
    • +1 – trate de ambos. en mi caso de uso Include() tomó 7 minutos, Load() llevó a 1,9 segundos y utiliza menos memoria RAM. He añadido LazyLoadingEnabled = false;
    • Excelente respuesta. Lo único que hay que agregar es que he sido a través de este ejercicio y en mi particular caso hemos encontrado el rendimiento con ser inaceptable. He utilizado AutoMapper del ProjectTo (QueryableExtension) y un nuevo v. simple DTO / POCO eficaz para controlar el SQL EF generado. Tengo mi consulta ahora en 1/20 de la época. Gracias JBogard ! docs.automapper.org/en/stable/Queryable-Extensions.html
  2. 21

    Include() será escrito a SQL como JOIN: una base de datos de ida y vuelta.

    Cada Load()-instrucción es «cargar explícitamente» la solicitada entidades, por lo que una base de datos de ida y vuelta por llamada.

    Así Include() será probablemente la más sensata elección en este caso, pero depende del diseño de base de datos, la frecuencia de este código se llama y la duración de su DbContext vidas. ¿Por qué no probar de las dos maneras y el perfil de las consultas y comparar los tiempos?

    Ver Relacionados Con La Carga De Las Entidades.

    • Su explicación es correcta, pero Include() no tiene que ser necesariamente la más sensata elección. Dependiendo del hormigón de las definiciones de la tabla, y la base de datos utilizada, la consulta con tantas incluye puede llegar a ser tan complejo que se realiza mucho peor de consultas por separado con Load(). (Sí, he tenido que pasar.)
    • de acuerdo, eso puede suceder, aunque no me parece que cinco se une a muchos. La verdadera respuesta sería: «Medir» de todos modos, como no sabemos nada acerca de OP de la base de datos.
    • Tarde en el juego aquí, pero la Carga NO está explícitamente relacionados con la carga de las entidades. Utiliza la carga explícita en el código con el fin de darle un control granular sobre sus entidades relacionadas con el uso de la Colección de Referencia o palabra clave. El uso de la Carga en la serialización de los escenarios, como la devolución de JSON desde un controlador, podría causar un escenario donde todas las entidades se cargan de forma recursiva.
  3. 10

    Estoy de acuerdo con @MichaelEdenfield en su respuesta pero yo quería comentar sobre el anidado de las colecciones de escenario. Usted puede evitar tener que hacer bucles anidados (y la de muchos resultante de llamadas a la base de datos) girando la consulta de adentro hacia afuera.

    Lugar de bucle hacia abajo a través de un Cliente de la colección de Pedidos y, a continuación, realizar otro bucle anidado a través de la Orden OrderItems colección decir, usted puede consultar la OrderItems directamente con un filtro como el siguiente.

    context.OrderItems.Where(x => x.Order.CustomerId == customerId);

    Obtendrá la misma resultante de los datos de las Cargas dentro de los bucles anidados, pero con solo una llamada a la base de datos.

    También, hay un caso especial que debe ser considerado con Incluye. Si la relación entre el padre y el hijo es de uno a uno, entonces el problema con el padre de datos que está siendo devuelto varias veces, no sería un problema.

    No estoy seguro de cuál sería el efecto si la mayoría de casos fue en el que ningún niño existía – un montón de valores nulos? Dispersa a los niños en un uno a uno relación podría ser más adecuado para la consulta directa de la técnica que he descrito.

  4. 6

    Include es un ejemplo de que con ganas de carga, donde no sólo de carga de las entidades de que se trate, sino también a todas las entidades relacionadas.

    Load es un manual de la EnableLazyLoading. Si este viene a false. Usted todavía puede perezosamente de la carga de la entidad que solicitó con .Load()

    • esto explica la diferencia que es grande, pero la pregunta estaba preguntando acerca del rendimiento
    • La carga NO es un manual de EnableLazyLoading. Si se establece a false, se debe utilizar la Carga Explícita, ya sea con la Colección de Referencia o palabra clave. Consulte entityframeworktutorial.net/EntityFramework4.3/…
  5. 2

    Siempre es difícil decidir si ir con muchas Ganas, Explícitas o, incluso, la Carga Diferida.

    Lo recomiendo de todos modos es siempre realizar algunos perfiles. Esa es la única manera de asegurarse de que su solicitud será eficiente o no.

    Hay un montón de herramientas que le ayudará a cabo. Eche un vistazo a este artículo de Julie Lerman donde ella listas de varias maneras diferentes de hacer perfiles. Una solución simple es empezar perfiles en el SQL Server Management Studio.

    No dude en hablar con un DBA (si tienes cerca de ti) que le ayudará a entender el plan de ejecución.

    Usted podría también tener una mirada un esta presentación donde escribí una sección acerca de la carga de datos y rendimiento.

  6. 1

    Una cosa más que añadir a este hilo. Depende de en qué servidor que utilice. Si usted está trabajando en sql server está bien usar con ganas de carga, pero para sqlite, usted tendrá que usar .Load() para evitar crossloading excepción causa de sqlite no se puede tratar con algunos incluyen declaraciones que ir más profundo que una dependencia del nivel de

Dejar respuesta

Please enter your comment!
Please enter your name here