web-dev-qa-db-ja.com

LINQ式ノードタイプ「ArrayIndex」は、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;
}

このコードは次の例外をスローします:The LINQ expression node type 'ArrayIndex' is not supported in LINQ to Entities.

ただし、aa[i]の代わりにxを指定すると機能します。

どうして?

56
Artur Keyan

これを修正するには、一時変数を使用します。

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

あなたのwhere句には

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

これは、ラムダ式を表現する方法です。それが式に変換され、データベースのクエリに変換されると、aa[i]、これは配列へのインデックスです。 つまり、定数として扱わない。データベース言語へのインデクサーの翻訳は不可能であるため、エラーが発生します。

87
George Duckett

どうやら、式ツリー内でarray index (aa[i])を使用すると、それも式に変換しようとします。

別の変数を使用して回避するだけです:

int presId = aa[i];
Presentation press = context.Presentations.Where(m => m.PresId == presId).FirstOrDefault();
14
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;
}

これを試して

5
Sender

SQLタイプまたは関数にマップすることはできません。

リストと配列を互いに混合していることに気付いています。このコードで実行したいことはすべて、リストを使用して簡単に実行できます。

次のコードは、必要なことをすべて行います。

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
} 

「短いスタイル」ですが、他の多くの関数を記述する場合はお勧めしません。

1

エラーを回避するために単純化できます:

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