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();
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
yAPPLY
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, sencilloSELECT
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 yLoad
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.
Include()
tomó 7 minutos,Load()
llevó a 1,9 segundos y utiliza menos memoria RAM. He añadidoLazyLoadingEnabled = false;
Include()
será escrito a SQL comoJOIN
: 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 suDbContext
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.
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 conLoad()
. (Sí, he tenido que pasar.)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.
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.
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 laEnableLazyLoading
. Si este viene afalse
. Usted todavía puede perezosamente de la carga de la entidad que solicitó con.Load()
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.
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