LINQ to Entities no reconoce el índice de matriz

Tengo la siguiente función en mi código

public List GetpathsById(List id) { List paths = new List(); for (int i = 0; i  m.PresId == id[i]).FirstOrDefault(); paths.Add(press.FilePath); } return paths; } 

Pero cuando bash esto, comstackdor obtiene un error como este.

 LINQ to Entities does not recognize the method 'Int64 get_Item(Int32)' method, and this method cannot be translated into a store expression. 

Entonces trato de hacer algo como esto y todo funciona bien.

  public List GetpathsById(List id) { long x; List paths = new List(); for (int i = 0; i  m.PresId == x).FirstOrDefault(); paths.Add(press.FilePath); } return paths; } 

Así que me pregunto, ¿por qué? No puedo obtener ninguna respuesta para ese comportamiento en mi mente. ¿Alguien puede explicar esta paradoja?

No hay magia: los árboles de expresiones se traducen en consultas SQL, que es lo que entienden las bases de datos relacionales. Podrías hacer casi cualquier cosa en un árbol de expresiones. Desafortunadamente no todas las operaciones están implementadas. Considere el siguiente ejemplo:

 Presentation press = context .Presentations .Where(m => SomeCustomFunctionThatUsesUnmanagedPInvokeCode(m.PresId)) .FirstOrDefault(); 

¿Qué esperas que sea la consulta SQL generada?

Ese es el caso de los indexadores de matriz. No se pueden traducir a consultas SQL.

Dicho esto, en su caso, lo siguiente podría ser un poco más simple:

 public List GetpathsById(List id) { return (from p in context.Presentations where id.Contains(p.PresId) select p.FilePath ).ToList(); } 

El método .Contains se traducirá a una cláusula SQL IN . Esto evita enviar múltiples consultas SQL a la base de datos como lo hace en su ejemplo en cada iteración.

Esta pregunta fue hecha por otro usuario, por lo que debe ser una tarea escolar.

Básicamente le di esta misma respuesta al otro usuario.

No se puede asignar a un tipo o función de SQL.

Todo lo que quiera hacer en este código se puede hacer simplemente usando la lista e iterándola de una manera ligeramente diferente.

El siguiente bit de código hará todo lo que necesites.

 public List GetpathsById(List id) { List paths = new List(); foreach(long aa in id) { Presentation press = context.Presentations.Where(m => m.PresId == aa).FirstOrDefault(); paths.Add(press.FilePath); } return paths; }