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