LINQ is a very powerful feature in .NET, however its syntax can be a bit confusing sometimes for some developers plus having the ability to perform queries in our code it’s not a novelty either, I did some FoxPro in the past and this capability was present already, so using and implementing LINQ it’s not that difficult to me =) Anyways… Some days ago I had to write and implement some caching mechanism on this SharePoint based solution I’m currently working on which integrates SAP, CRM, WebMethods, AJAX and so on. The issue I had was related to grouping data based on more than one column (which it’s not LINQ’s out-of-the-box functionality), let’s remember that grouping it’s provided by the Queryable class and my working data was based on a DataTable which it’s a totally different class… so I came with this easy and quick idea to implement, since I’m using LINQ to ADO.NET and DataSets as well as DataTable don’t contain the AsQueryable extension method I had to create a “pseudo” extension method to handle DataRow collections then use a Func delegate which is going to be passed to the IEnumerable<T>.GroupBy extension method, you may be wondering by now, but what does the method targeted by the delegate do? Well… It’s a very simple a short answer, I just create a unique key (used to group my data) based on concatenating the value for the columns I want to group by and voila! it’s works… It’s not hard or time consuming to implement and it gives me the results that I’m expecting. The images shown below illustrate the code that’s required to accomplish this.
Kind regards,
Angel
LINQ es una característica muy poderosa en .NET, sin embargo su sintaxis puede ser un poco confusa algunas veces para los desarrollares, además la capacidad de realizar consultas en nuestro código tampoco es una novedad, yo desarrollé con FoxPro en el pasado y ésta característica estuvo siempre presente, así que utilizar ó implementar LINQ no es tan difícil para mí =) En fin… Hace unos días atrás tuve que escribir e implementar un mecanismo de caché para ésta solución basada en SharePoint en la que trabajo actualmente la cual integra SAP, CRM, WebMethods, AJAX y pare usted de contar. El problema que tenía era en relación al agrupamiento de datos basado en más de una columna (Lo cuál no es una funcionalidad por defecto en LINQ), recordemos que el agrupamiento está dado por la clase Queryable y mis datos estaban almacenados en un DataTable los cuales son una clase totalmente distinta, por lo que se me ocurrió ésta idea que resultó ser rápida y fácil de implementar; ya que estoy utilizando LINQ con ADO.NET y DataSets al igual que DataTable no contienen el método de extensión AsQueryable tuve entonces que crear un “pseudo” método de extensión para manipular una colección de DataRow que me permitiera después utilizar un delegado Func que posteriormente es pasado al método de extensión IEnumerable<T>.GroupBy, ustedes se estarán preguntándose ahora, pero qué hace el método apuntado por el delegado? Bueno… Es una respuesta corta y sencilla, sólo creo una clave única (utilizada para agrupar mis datos) a partir de concatenar el valor de las columnas por la cual quiero agrupar y voila! Funciona… No es díficil ó toma tiempo para hácerlo y me da los resultados que espero. Las imágenes mostradas a continuación contienen el código que es necesario para conseguir esto.
Saludos cordiales,
Angel
Image 1 – GetTestData method
Image 2 – GroupData method
Image 3 – EnumerableDataRowExtension class

Image 4 – PerformDataGrouping method

Image 5 – It’s so easy to do in FoxPro =)
Have you ever wanted to browse code metrics based on a code base or manage complexity and dependency plus get to know how your code is structured and even more? If that’s your case then you should try Visual NDepend. This tool based on 4 different inputs (Image 1):
-
.NET Assemblies
-
.NET PDB Files
-
C# Source Files
-
Coverage Files
Performs an analysis and tells us more about our code in just minutes. The “easiest” and most common way to measure any code base is through counting the number of lines of code which at the end is a time consuming and boring task, Visual NDepend does a much more than that because it supports CQL (Code Query Language) so we can query our code based on a given criteria and focus on design and architecture without incurring in dependencies faults in the event of refactoring.
The user interface is pretty straightforward (Image 2), just create a new project, add assemblies to be analized and go. The hardest part but after a while becomes easy is the ability to interpret analysis output results (Image 3) but like everything else in life… it’s all about practice.
At the end of the analysis we get a report which is a condensed view about our code structure and organization (Image 4), we can also see where we are in terms of abstractness and instability (Image 5)
So if you’re a developer or architect who expects nothing more than clean and reusable code, this tool is the right for you.
Kind regards,
Angel
¿Alguna vez has querido navegar a través de las métricas basadas en tu código base ó manejar la complejidad y dependencia, además de llegar a saber como está estructurado tu código y aún más? Sí ese es tu caso entonces deberías probar Visual NDepend. Ésta herramienta basada en 4 entradas diferentes (Imagen 1):
-
Ensamblajes de .NET
-
Archivos PDB
-
Código fuente de C#
-
Archivos de Cobertura
Realiza un análisis y nos dice más de nuestro código en cuestión de minutos. La manera “más fácil” y común de medir cualquier código base es a través del conteo del número de líneas de código lo cual resulta ser una tarea aburrida que consume bastante tiempo, Visual NDepend hace mucho más que eso porque soportaCQL (Lenguaje de Consulta de Código) así que podemos consultar nuestro código basado en un criterio dado y enfocarnos en el diseño y arquitectura sin incurrir en faltas asociadas a dependencias en el caso que tengamos que refactorizar.
La interfaz es realmente sencilla (Imagen 2), sólo crear un nuevo proyecto, agregar ensamblajes para analizar y ejecutar. La parte más díficil pero después de un tiempo se hace sencilla es la habilidad de interpretar el resultado del análisis (Imagen 3) pero como todo en la vida… es sólo práctica.
Al final del análisis obtenemos un reporte el cual es una vista condensada acerca de la estructura y organización de nuestro código (Imagen 4), también podemos ver en donde nos encontramos en términos de abstracción e inestabilidad (Imagen 5)
Así que si eres un desarrollador ó un arquitecto que no espera sino código limpio y reutilizable, esta es la herramienta adecuada para ti.
Saludos cordiales,
Angel
Image 1 – NDepend Analysis inputs

Image 2 – NDepend welcome screen
Image 3 – NDepend dependency matrix and metrics
Image 4 – NDepend analysis report
Image 5 – Abstractness vs. Instability