wake-up-neo.com

Der LINQ-Ausdrucksknotentyp 'ArrayIndex' wird in LINQ to Entities nicht unterstützt

public List<string> GetpathsById(List<long> id)
{
    long[] aa = id.ToArray();
        long x;
    List<string> paths = new List<string>();
    for (int i = 0; i < id.Count; i++)
    {
        x = id[i];
        Presentation press = context.Presentations.Where(m => m.PresId == aa[i]).FirstOrDefault();
        paths.Add(press.FilePath);
    }
    return paths;
}

Dieser Code löst die folgende Ausnahme aus: The LINQ expression node type 'ArrayIndex' is not supported in LINQ to Entities. 

Wenn ich jedoch x anstelle von aa[i] gebe, funktioniert es.

Warum?

54
Artur Keyan

Um dies zu beheben, verwenden Sie eine temporäre Variable:

var tmp = aa[i];
...
m => m.PresId == tmp

In Ihrer Wo-Klausel haben Sie

m => m.PresId == aa[i]

dies ist eine Möglichkeit, einen Lambda-Ausdruck auszudrücken. Wenn dies in einen Ausdruck konvertiert und anschließend in eine Abfrage in Ihrer Datenbank konvertiert wird, findet es aa[i], einen Index in einem Array. d. h. es behandelt es nicht als Konstante . Da eine Übersetzung eines Indexers in Ihre Datenbanksprache nicht möglich ist, wird der Fehler angezeigt.

82
George Duckett

Wenn Sie eine array index (aa[i]) innerhalb eines Ausdrucksbaums verwenden, versucht sie dies offensichtlich auch in einen Ausdruck zu konvertieren.

Umgehen Sie es einfach mit einer separaten Variablen:

int presId = aa[i];
Presentation press = context.Presentations.Where(m => m.PresId == presId).FirstOrDefault();
13
Trax72
 public List<string> GetpathsById(List<long> id)
{
long[] aa = id.ToArray();
    long x;
List<string> paths = new List<string>();
for (int i = 0; i < id.Count; i++)
{
    x = id[i];
    int temp = aa[i];
    Presentation press = context.Presentations.Where(m => m.PresId == temp).FirstOrDefault();
    paths.Add(press.FilePath);
}
return paths;
}

versuche dies

4
Sender

Es kann keinem SQL-Typ oder einer SQL-Funktion zugeordnet werden.

Sie wissen, dass Sie Ihre Liste und Ihr Array miteinander mischen. Alles, was Sie in diesem Code tun möchten, können Sie einfach über die Liste erledigen.

Der folgende Code macht alles, was Sie dafür brauchen.

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

zu

public IEnumerable<String> GetpathsById(List<long> id) 
{ 
    foreach(long item in id) 
        yield return = (context.Presentations.Where(m => m.PresId == item).FirstOrDefault()).FilePath
} 

"Kurzer Stil", aber nicht empfehlenswert, wenn Sie viele andere Funktionen schreiben.

1

Kann vereinfacht werden, um den Fehler zu vermeiden:

public List<string> GetpathsById(List<long> id)
{
    return context.Presentations.Where(x => id.Contains(x.PresId)).Select(x => x.FilePath).ToList();
}