Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 26 de enero de 2021
Entity Framework Core

El desarrollo de EF6.TagWith lo comencé hace algo más de un año, cuando escribía para el blog lo interesante que me parecía el extensor TagWith() de Entity Framework Core y me preguntaba por qué no existía algo similar para Entity Framework 6.x.

Como recordaréis, la idea era traer a EF "clásico" la posibilidad de añadir a consultas realizadas desde C# un comentario o etiqueta que después podría ser fácilmente visible en trazas, como las proporcionadas por SQL Server Profiler o herramientas de análisis de rendimiento.

No pensé que existieran muchos desarrolladores a los que pudiera interesar, pero con el tiempo esto me ha servido para confirmar que cualquier aportación a la comunidad, por pequeña que sea, puede ayudar a un buen número de personas.

A día de hoy, y por increíble que parezca, este pequeño y humilde paquetito ha sido instalado más de 6.000 veces, con una media de 10 descargas al día, y ha recibido issues y pull requests de desarrolladores que han decidido contribuir a su mejora a través del sitio del proyecto en GitHub. Impresionante.

Pues bien, por fin he podido dedicar un rato a actualizarlo y he publicado su versión 1.2.1. Esta revisión soluciona algunos errores menores y problemas de compatibilidad con proyectos .NET Framework 4.5, además de incluir un par de novedades fruto del feedback recibido de sus usuarios, que describimos a continuación.

1. Inicialización más sencilla

La inicialización de EF6.TagWith consiste básicamente en añadir un interceptor al contexto de Entity Framework, que será el encargado de modificar al vuelo las sentencias SQL enviadas al motor para incluirle las etiquetas. 

La versión 1.2 añade la posibilidad de hacerlo de forma más sencilla, al ocultar al desarrollador esos detalles de implementación; ahora basta con llamar al método TagWith.Initialize() indicando el tipo del componente de tageado específico del motor de datos que estemos utilizando:

TagWith.Initialize<SqlServerTagger>();

2. Etiquetas en línea

Antes de la versión actual, las etiquetas siempre eran insertadas como "prefijos" de la sentencia SQL. Por ejemplo, si ejecutamos la siguiente consulta con LINQ:

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");

Esto enviaría la sentencia SQL mostrada a continuación, donde podemos observar que el texto de la etiqueta es insertado como comentario justo al principio:

-- 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

Aunque este comportamiento es válido en muchas ocasiones, hay otras veces en los que el sistema de trazas elimina todos los comentarios previos, como ocurre en la Query Store de SQL Server o en las analíticas de Azure SQL. Para cubrir este escenario, EF6.TagWith soporta ahora la inclusión de etiquetas en línea, como en el siguiente ejemplo, donde vemos que el comentario se ha incluido después de la setencia SELECT, y justo antes del resto de cláusulas:

SELECT -- Get top 10 older friends with country
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

Para conseguir esto, simplemente debemos inicializar el componente con un objeto de tipo TaggingOptions en cuya propiedad TagMode especificamos el valor TagMode.Infix:

TagWith.Initialize<SqlServerTagger>(
    new TaggingOptions() { 
        TagMode = TagMode.Infix 
    });

¡Espero que os sea de utilidad!

Publicado en Variable not found.

Aún no hay comentarios, ¡sé el primero!