2011-03-15 12 views
13

Leyendo las preguntas here y here me ha dado una idea de la situación, y parece que el uso de AsEnumerable consume memoria. ¿Hay una mejor manera de hacer este LINQ y la forma en que se hace ahora, es la información que sale confiable?¿Cuál es el efecto de AsEnumerable() en una entidad LINQ?

Eliminando los resultados de AsEnumerable en una "Secuencia local no se puede utilizar en implementaciones de LINQ to SQL de operadores de consultas excepto el operador Contiene".

var results = from p in pollcards.AsEnumerable() 
          join s in spoils.AsEnumerable() on new { Ocr = p.OCR, fileName = p.PrintFilename } equals new { Ocr = s.seq, fileName = s.inputFileName } 
          where p.Version == null 
          orderby s.fileOrdering, s.seq 
          select new ReportSpoilsEntity 
          { 
           seq = s.seq, 
           fileOrdering = s.fileOrdering, 
           inputFileName = s.inputFileName, 
           Ocr = p.OCR, 
           ElectorName = p.ElectorName 
          }; 

Respuesta

24

AsEnumerable() es eficazmente un yeso para IEnumerable<T>, lo que hace que la resolución miembro de localizar a los miembros de Enumerable en lugar de Queryable. Por lo general, se usa cuando desea forzar que parte de una consulta se ejecute como SQL (o similar) y el resto se ejecute utilizando LINQ to Objects.

Consulte mi Edulinq blog post on it para obtener más información.

Ahora ha recibido dos llamadas al AsEnumerable. Puedo ver cómo eliminar el primero pero no el segundo podría causar problemas, pero ¿has intentado eliminar ambos?

var results = from p in pollcards 
       join s in spoils 
       on new { Ocr = p.OCR, fileName = p.PrintFilename } 
       equals new { Ocr = s.seq, fileName = s.inputFileName } 
       where p.Version == null 
       orderby s.fileOrdering, s.seq 
       select new ReportSpoilsEntity 
       { 
        seq = s.seq, 
        fileOrdering = s.fileOrdering, 
        inputFileName = s.inputFileName, 
        Ocr = p.OCR, 
        ElectorName = p.ElectorName 
       }; 
+0

me llegó el error al eliminar ambos AsEnumerables. (No he intentado eliminar solo uno). ¿Importa que los botines y las tarjetas de visita sean declaraciones LINQ? (una IQueryable y una Collection ) – Andy

+1

@Andy: Sí, el hecho de que 'spoils' sea una colección en memoria es definitivamente relevante. Supuse que era otra consulta DB. No sé de una manera de unirme medio a la mitad de la base de datos. ¿'Botines' * originalmente * provienen de la base de datos? –

+0

los botines se crean teniendo 2 querrys, uno para los tops10 uno para los últimos 10, haciendo una unión en el resultado, y luego llenando la Colección por cada acción a través de esa unión. No estoy seguro de por qué no devolvemos la unión y la convertimos de una Iqueryable a una colección. (¿Volvería el IQuerryable a resolver la necesidad de los AsEnumerables?) – Andy

5

Usando AsEnumerable se romperá la consulta y hacer la "parte exterior", como LINQ a objetos en lugar de SQL LINQ to. Efectivamente, está ejecutando un "select * from ..." para sus tablas y luego haciendo las uniones, donde filtro de cláusula, ordenamiento y proyección del lado del cliente.

1

Tenga cuidado al utilizar AsEnumerable con Entity Framework. si su tabla tiene muchos datos, su consulta se vuelve lenta debido a la consulta, primero carga los datos y aplica la cláusula where, ordenando y proyectando.

Cuestiones relacionadas