LINQ

No usar el metodo IEnumerable.Count de LINQ

.NET Logo

.NET Logo

Los que usen LINQ, especificamente LINQ to SQL, favor de leer el siguiente articulo:

IEnumerable.Count() is a Code Smell

El articulo explica que es muy comun para cualquier desarrollador utilizar este metodo para hacer validaciones del tipo:

if(products.Count() == 0) ... 

El problema es que el metodo Count() de IEnumerable es un extension method que no va a hacer short-circuit al encontrar más de un item al ser usado en el contexto del ejemplo anterior.

Peor aun, como la ejecución de LINQ To SQL es deferida, los resultados del metodo Count() no se quedan en cache y cualquier nueva llamada a Count() vuelve a iterar todos los elementos de la coleccion. Tomando en cuenta que LINQ To SQL esta accesando una base de datos…es muy mal performance.

El articulo sugiere usar como alternativa el metodo .Any(). que produce un SQL mas optimizado.

Y si se necesita hacer llamadas posteriores al Count() o Any(), se recomienda eliminar la deferred execution pasando los resultados del query de LINQ a una Lista, de la siguiente manera:

IList<Product> products = GetProducts().ToList();

Para detalles completos, favor de leer el articulo original, del blog de Lee Richardson, Rapid Application Development

LINQ is NOT LINQ To SQL

.NET Logo

.NET Logo

Los que no sepan que es LINQ...les conviene leer este post, de Justin Etheredge, que aclara las confusiones entre la tecnologia LINQ (Language INtegrated Query) y el ORM LINQ To SQL.

LINQ is NOT LINQ To SQL – Justin Etheredge, CodeThinked

 Scroll to top