2010-02-26 14 views
11

Estoy usando el método elementat(Int32) para obtener un elemento específico del resultado de una consulta.LINQ to Entities no reconoce el método ElementAt (i);

var mds = db.TDP_MissioniDestinazioni.Where(p => p.MissioneID == missioneRow.MissioneID); 

destinazioneRow = mds.ElementAt(i); 

LINQ to Entities no reconoce el método 'TimeEntModel.TDP_MissioniDestinazioni ElementAt [TDP_MissioniDestinazioni]
(System.Linq.IQueryable`1 [TimeEntModel.TDP_MissioniDestinazioni], Int32)' método, y este método no se puede traducir a una expresión de tienda .

¿Por qué me sale este error y cómo puedo solucionarlo?

Respuesta

20

¿Está contento de obtener todos los resultados "anteriores"? Si es así, llame al ToList() para almacenarlos en la memoria caché o al AsEnumerable() para obtenerlos en cada llamada, con el AsEnumerable como una forma de forzar al compilador a llamar al Enumerable.ElementAt en lugar del Queryable.ElementAt.

Puede haber una manera mejor (por ejemplo, usar Take u Skip), ¿podría dar más información sobre la imagen más grande?

16

Simplemente puede mezclar Skip y First para hacer el truco:

mds.Skip(i).First() 
+2

@Steven: ¿Alguna idea de lo que la traducción para ese sería como comparar con mds.Skip (i - 1) .First()? –

+1

@Jon: con suerte EF generaría el mismo código SQL para esto, pero mi conjetura es que su 'mds.Skip (i-1) .First()' produciría SQL más eficiente. ¡Bien! – Steven

+6

Creo que tienes que usar '.Skip (i)' en lugar de 'i-1' ya que' .ElementAt (i) 'comienza con 0. Entonces el equivalente a' .ElementAt (0) 'sería' .Skip (0) .Primero() '. Sin embargo, tengo casi tres años de retraso. –

Cuestiones relacionadas