entity framework - registro - Rendimiento de Linq a Entidades vs ESQL
query entity framework c# (6)
Al usar Entity Framework, ¿ESQL funciona mejor que Linq para las entidades?
Preferiría usar Linq para Entidades (principalmente debido a la verificación de tipo fuerte), pero algunos de los otros miembros del equipo citan el rendimiento como una razón para usar ESQL. Me gustaría tener una idea completa de los pros y los contras de usar cualquiera de los métodos.
Cuantos más códigos pueda cubrir con verificación de tiempo de compilación para mí, es algo que otorgaría una prima mayor que el rendimiento. Habiendo dicho eso en esta etapa, probablemente me inclinaría hacia ESQL no solo por el rendimiento, sino que también es (en el presente) mucho más flexible en lo que puede hacer. No hay nada peor que usar una pila de tecnología que no tiene una función que realmente necesitas.
El marco de la entidad no admite cosas como propiedades personalizadas, consultas personalizadas (para cuando realmente se necesita ajustar el rendimiento) y no funciona igual que linq-to-sql (es decir, hay características que simplemente no funcionan en la entidad marco de referencia).
Mi impresión personal del Entity Framework es que hay mucho potencial, pero es probable que sea un poco "rígido" en su implementación para usar en un entorno de producción en su estado actual.
ESQL también puede generar algunos sql particularmente peligrosos. Tuve que rastrear un problema con una consulta de ese tipo que usaba clases heredadas y descubrí que mi pequeño ESQL de 4 líneas se tradujo en una declaración de monstruo SQL de 100 000 caracteres.
Hizo lo mismo con Linq y el código compilado fue mucho más manejable, digamos 20 líneas de SQL.
Además, lo que otras personas mencionaron, Linq tiene mucha fuerza, aunque es muy molesto depurar sin la función editar y continuar.
ANUNCIO
Entity-SQL (eSQL) le permite hacer cosas tales como consultas dinámicas más fácilmente que LINQ to Entities. Sin embargo, si no tiene un escenario que requiera eSQL, dudaría si confiar en él a través de LINQ porque será mucho más difícil de mantener (por ejemplo, no más tiempo de compilación, etc.).
Creo que LINQ también te permite precompilar tus consultas, lo que puede darte un mejor rendimiento. Rico Mariani blogueó sobre el rendimiento de LINQ hace un tiempo y analiza las consultas compiladas.
Las diferencias más obvias son:
Linq to Entities es un código fuertemente tipado que incluye una buena sintaxis de comprensión de consultas. El hecho de que el "desde" aparece antes que el "seleccionar" permite que IntelliSense lo ayude.
Entity SQL utiliza consultas tradicionales basadas en cadenas con una sintaxis similar a SQL más familiar, donde la instrucción SELECT viene antes del FROM. Debido a que eSQL está basado en cadenas, las consultas dinámicas pueden estar compuestas de manera tradicional en tiempo de ejecución utilizando la manipulación de cadenas.
La diferencia clave menos obvia es:
Linq to Entities te permite cambiar la forma o "proyectar" los resultados de tu consulta en cualquier forma que necesites con la sintaxis "select new {...}". Los tipos anónimos, nuevos en C # 3.0, han permitido esto.
La proyección no es posible utilizando Entity SQL, ya que siempre debe devolver un ObjectQuery <T>. En algunos casos, es posible utilizar ObjectQuery <object>; sin embargo, debe evitar el hecho de que .Select siempre devuelve ObjectQuery <DbDataRecord>. Ver el código a continuación ...
ObjectQuery<DbDataRecord> query = DynamicQuery(context,
"Products",
"it.ProductName = ''Chai''",
"it.ProductName, it.QuantityPerUnit");
public static ObjectQuery<DbDataRecord> DynamicQuery(MyContext context, string root, string selection, string projection)
{
ObjectQuery<object> rootQuery = context.CreateQuery<object>(root);
ObjectQuery<object> filteredQuery = rootQuery.Where(selection);
ObjectQuery<DbDataRecord> result = filteredQuery.Select(projection);
return result;
}
Hay otras diferencias más sutiles descritas por uno de los miembros del equipo en detalle aquí y aquí .
Para consultas directas estoy usando linq para entidades, para consultas dinámicas estoy usando ESQL. Quizás la respuesta no sea cualquiera de las dos cosas, sino también /.
buen gráfico que muestra las comparaciones de rendimiento aquí: Entity Framework Performance Explored no se observa mucha diferencia entre ESQL y Entities, pero las diferencias generales son significativas en el uso de entidades sobre consultas directas
Entity Framework utiliza dos capas de asignación de objetos (en comparación con una sola capa en LINQ a SQL), y la asignación adicional tiene costos de rendimiento. Al menos en EF versión 1, los diseñadores de aplicaciones deben elegir Entity Framework solo si las capacidades de modelado y mapeo ORM pueden justificar ese costo.