web-dev-qa-db-fra.com

Le type de noeud d'expression LINQ 'ArrayIndex' n'est pas pris en charge dans LINQ to Entities

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;
}

Ce code lève l'exception suivante: The LINQ expression node type 'ArrayIndex' is not supported in LINQ to Entities. 

Cependant, si je fournis x au lieu de aa[i], cela fonctionne.

Pourquoi?

54
Artur Keyan

Pour résoudre ce problème, utilisez une variable temporaire:

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

Dans votre clause où vous avez

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

qui est une façon d’exprimer une expression lambda. Lorsque cela est converti en expression, puis converti en une requête sur votre base de données, il trouve le aa[i], qui est un index dans un tableau. c’est-à-dire qu’il ne le traite pas comme une constante . Puisqu'une traduction d'un indexeur dans la langue de votre base de données est impossible, l'erreur est générée.

82
George Duckett

Apparemment, si vous utilisez un array index (aa[i]) dans un arbre d’expression, il essaie également de le convertir en expression.

Contournez-le simplement en utilisant une variable séparée:

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;
}

essaye ça

4
Sender

Il ne peut pas être mappé sur un type ou une fonction SQL.

Vous savez que vous mélangez votre liste et votre tableau les uns avec les autres. Tout ce que vous voulez faire dans ce code peut être fait simplement en utilisant la liste.

Le code suivant fera tout ce dont vous avez besoin.

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; 
} 

à

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

"Style court", mais non recommandé si vous écrivez beaucoup d'autres fonctions.

1

Peut être simplifié pour éviter l'erreur:

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