2011-09-16 21 views
8

estoy utilizando LINQ ampliamente en mi proyecto, el rendimiento hasta el momento es bueno, sólo tengo una duda, si he utilizado LINQ algo como estométodo Count LINQ y rendimiento

var getData = objData.where(obj => obj.isDelete ==false) 
if (getData != null && getData.Count() > 0) 
    foreach(xyz as obj in getdata.ToList()) 
    { 
     //some operation 
    } 

¿El getData.Count() y getdata.ToList() realiza dos recuperaciones diferentes en el objeto? O según el concepto de carga differ cuando se ejecuta getData.Count(), no se realiza ninguna operación para .ToList.

Si no es así, ¿debo eliminar la condición de conteo, mejorará el rendimiento?

Estoy utilizando Enterprise Library 5.0 acessor métodos para obtener datos de DB List lstpack = new List();

  var accessor = _sqlDatabase.CreateSprocAccessor<PackageForClient>("PackageForClientApp", MapBuilder<PackageForClient> 
         .MapAllProperties() 
         .Build() 
       ); 

      var Data = accessor.Execute(startdate, enddate,beinh); 
      if (Data != null) //&& Data.Count() > 0 //This has been removed as it is doing an extra fetch 
       lstpack = Data.ToList<PackageForClient>(); 

Ahora devolver la lista

Respuesta

13

Es difícil decir con seguridad, ya que no sabemos lo que es getData, pero:

  • Sí, lo que potencialmente se habrá operaciones completamente separadas
  • En general, use Any() en lugar de Count() > 0; puede ser mucho más eficiente, sobre todo en LINQ a Objetos
  • Calling ToList va a ser relativamente barato cuando está vacío - sólo lo hacen si necesita una lista
  • Si no realmente necesidad en una lista, simplemente iterar todos modos (si no hay datos, que no se consigue en el cuerpo del bucle)
  • Where nunca se volverá nula

en otras palabras, probablemente me escribo:

foreach (Obj xyz in objData.Where(obj => !obj.isDelete)) 
{ 
    //some operation 
} 
+0

¡Genial! gracias, aquí getData es una lista de objetos devueltos por conjunto de resultados de Enterprise Library 5.0, sorprendido de ver que ejecuta el Procedimiento almacenado dos veces, uno cuando llamamos al método Count de getData y otro cuando se usa ToList. – Deepesh

+0

Agregué un código en mi pregunta solamente – Deepesh

+0

@Deepesh: ¿Por qué estás sorprendido de ver eso? 'getData' no es una lista de objetos, es una * consulta *. Llamar a 'ToList' es lo que lo convierte en una lista de objetos. –