martes, 18 de junio de 2019
Como sabemos, las consultas que definimos mediante LINQ contra conjuntos de datos de Entity Framework son traducidas automáticamente a queries SQL, que es lo que finalmente ejecuta el servidor de base de datos.
Muchas veces estas sentencias SQL generadas de forma automática y ejecutadas al servidor son fáciles de leer y entender, pero hay veces que EF traduce el LINQ a consultas SQL enormes, complejas, con escasa legibilidad y difícilmente reconocibles.
Seguro que alguna vez habéis tenido por delante una de estas complejas sentencias SQL generada por Entity Framework y os hubiera gustado saber en qué punto del código fue lanzada. Esto es muy frecuente, por ejemplo, cuando estamos monitorizando las consultas en ejecución con SQL Profiler, o al examinar las queries que consumen mayor número de recursos desde los paneles de Azure SQL.
En versiones "clásicas" de Entity Framework había que ingeniárselas para conseguirlo, pero, como podréis comprobar a continuación, en EF Core la cosa se ha simplificado bastante :)
Pues bien, la solución planteada por Entity Framework Core 2.2 es igualmente sencilla, o incluso más ;) Basta con introducir una llamada a
Publicado en Variable not found.
Muchas veces estas sentencias SQL generadas de forma automática y ejecutadas al servidor son fáciles de leer y entender, pero hay veces que EF traduce el LINQ a consultas SQL enormes, complejas, con escasa legibilidad y difícilmente reconocibles.
Seguro que alguna vez habéis tenido por delante una de estas complejas sentencias SQL generada por Entity Framework y os hubiera gustado saber en qué punto del código fue lanzada. Esto es muy frecuente, por ejemplo, cuando estamos monitorizando las consultas en ejecución con SQL Profiler, o al examinar las queries que consumen mayor número de recursos desde los paneles de Azure SQL.
En versiones "clásicas" de Entity Framework había que ingeniárselas para conseguirlo, pero, como podréis comprobar a continuación, en EF Core la cosa se ha simplificado bastante :)
Actualizado el 25-Jun-2019: si buscas cómo conseguir algo parecido en EF6, puedes echar un vistazo a este post.
Etiquetando consultas
Cuando creamos consultas usando SQL a pelo, es bastante sencillo incluirles una marca que, a posteriori, nos ayude a identificar su origen o finalidad. Basta con insertar un comentario como en el siguiente ejemplo:var sql = @"
-- Get top 10 older friends with country
SELECT TOP 10 [friend].[Name] AS [FriendName], [friend].[Age],
[friend.Country].[Name] AS [CountryName]
FROM [Friends] AS [friend]
LEFT JOIN [Countries] AS [friend.Country] ON [friend].[CountryId] = [friend.Country].[Id]
ORDER BY [friend].[Age] DESC";
context.Database.ExecuteSqlCommand(sql);
De esta forma, cuando veamos aparecer dicha consulta en los logs del servidor, podremos identificar rápidamente de qué se trata.Pues bien, la solución planteada por Entity Framework Core 2.2 es igualmente sencilla, o incluso más ;) Basta con introducir una llamada a
TagWith()
en la especificación de la consulta LINQ, suministrándole la etiqueta que deseamos añadir a la misma, como se muestra a continuación:var query = context.Friends
.OrderByDescending(friend => friend.Age)
.Take(10)
.Select(friend =>
new { FriendName = friend.Name, friend.Age, CountryName = friend.Country.Name })
.TagWith("Get top 10 older friends with country");
Y la consulta que enviaremos a la base de datos será la siguiente:-- Get top 10 older friends with country
SELECT TOP(@__p_0) [friend].[Name] AS [FriendName], [friend].[Age],
[friend.Country].[Name] AS [CountryName]
FROM [Friends] AS [friend]
LEFT JOIN [Countries] AS [friend.Country] ON [friend].[CountryId] = [friend.Country].[Id]
ORDER BY [friend].[Age] DESC
Mola, ¿eh?Publicado en Variable not found.
Patrocinador
Oferta de empleo: Desarrollador web .NET (Barcelona)
Si tienes más de dos años de experiencia desarrollando aplicaciones web ASP.NET/.NET Core y te gustan los retos tecnológicos, ven a trabajar con
nosotros a un proyecto de escala global que está revolucionando la atención al cliente en plataformas e-commerce.
Aún no hay comentarios, ¡sé el primero!
Enviar un nuevo comentario