martes, 25 de junio de 2019
Pues hablábamos hace unos días del extensor
TagWith()
de Entity Framework Core que, como recordaréis, venía de perlas para incluir un comentario en las consultas SQL enviadas al servidor de datos para poder identificarlas a posteriori: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");
Generated SQL
============================================
-- 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
Mientras escribía el post, pensaba que quizás sería interesante poder utilizar esta misma idea en Entity Framework 6, porque, al fin y al cabo, todos tenemos por ahí muchas aplicaciones en producción que continúan delegando en este marco de trabajo su acceso a datos. Tras una búsqueda en Google y no encontrar gran cosa, pensé que tampoco sería tan difícil de implementar algo que diera el apaño...TL;DR: Echad un vistazo a EF6.TagWith en NuGet o en el repo de GitHub.
Publicado por José M. Aguilar a las 8:05 a. m.
Hay
2 comentarios, ¡participa tú también!
Etiquetas: componentes, entity framework, trucos
lunes, 24 de junio de 2019
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- El veloz murciélago hindú…
José María Aguilar - Establecer textos por defecto y localizados en validaciones de ASP.NET Core MVC
José María Aguilar
.NET / .NET Core
- Making a tiny .NET Core 3.0 entirely self-contained single executable
Scott Hanselman - Using pointers in Image Processing
Napuzba - Parsing HTML data with C#
Bruno Sonnino - Net Core (Linux) Error: System.IO .IOException: The configured user limit on the number of inotify instances has been reached
Eduard Tomás - async y await en C#: cómo manejar asincronismo en .Net de manera fácil
Jorge Turrado - Cryptography in .NET
Gérald Barré - The Evolving Infrastructure of .NET Core
Matt Mitchell - Create interactive documentation with the new Try .NET template
Akshita Agarwal - Delegates as callback functions in csharp
Karthik Chintala - C# - The good parts
Sam Williams - Using High-Performance Techniques to Base64 Encode a GUID
Steve Gordon - Communicating between Python and .NET Core with Boost Interprocess
Jared Rhodes
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 :)
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.
lunes, 17 de junio de 2019
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Lo que ocurre cuando desarrolladores diseñan interfaces de usuario (II)
José María Aguilar - Localizar errores de validación del binding en ASP.NET Core MVC
José María Aguilar
.NET / .NET Core
- Announcing .NET Core 3.0 Preview 6
Richard Lander - Delegates And Events In C#
Shadman Kudchikar - Complete Sudoku Game for Windows using VB.NET 2013
Hung, Han - Empty try with finally
Jiří Činčura - Migrating a Sample WPF App to .NET Core 3 Part 1 & Part 2
Mike Rousos - Tangled in .NET: Will 5.0 really unify Microsoft's development stack?
Tim Anderson - Customize object displays in the Visual Studio debugger YOUR way
Leslie Richardson - Conditional Ref, Ref ReadOnly, Ref Reassignment in C# 7.X
Brij Bhushan Mishra - Calling Cognitive Services OCR Service from a .NET Application
David Giard - Try the new System.Text.Json APIs
Immo Landwerth - How to Debug LINQ queries in C#
Michael Shpilt - La potencia de la Reflexión (Parte 1)
Jorge Turrado
martes, 11 de junio de 2019
En el post anterior vimos que la estructura
Index
, junto con alguna cortesía del compilador, permitía la especificación de índices en arrays de forma muy sencilla. Veíamos cómo podíamos acceder a elementos concretos utilizando su posición en la colección, tanto contando desde el principio como desde el final:var primes = new[] { 2, 3, 5, 7, 11, 13, 17, 19 };
Index fromStart = 2; // = Index.FromStart(2) - conversión implícita
Index fromEnd = ^2; // = Index.FromEnd(2)
Console.WriteLine(primes[fromStart]); // 5
Console.WriteLine(primes[fromEnd]); // 17
Sin embargo, puede que a Index
por sí mismo tampoco le veáis demasiada utilidad... y así es. De hecho, su finalidad es más bien el dar soporte a rangos, una nueva característica de C#8 que nos permitirá referirnos a "porciones" de arrays o colecciones similares usando una sintaxis compacta e integrada en el lenguaje.
lunes, 10 de junio de 2019
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- 32 Síntomas que indican que estás afectado por el desarrollo
José María Aguilar - Cargar automáticamente objetos del modelo en acciones ASP.NET Core MVC
José María Aguilar
.NET / .NET Core
- C#9 – Type classes y extensiones
Eduard Tomás - Supporting the community with WF and WCF OSS projects
Scott Hunter - Throwing ArgumentException and InvalidOperationException
Peter Mbanugo - dnSpy: A Decompiler for .NET and Windows applications
Nick Randolph - Serializing a PascalCase Newtonsoft.Json JObject to camelCase
Andrew Lock - An Interesting Case Of .NET Performance and Caching
Khalid Abuhakmeh - Extension Methods Guidelines in C# .NET
Michael Shpilt - C# : Task Parallel Library (TPL) with async await and TaskCompletionSource for async I/O operations
Siddharth Patel - What's better than ILDasm? ILSpy and dnSpy are tools to Decompile .NET Code
Scott Hanselman - Ignoring a Billion-Dollar Mistake is simply not an Option
Ian Bebbington - PDF File Writer C# Class Library (Version 1.24.0)
Uzi Granot - How Can We Efficiently Sort Socks with C#?
Matthew Jones - Clever little C# and ASP.NET Core features that make me happy
Scott Hanselman