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
を指定すると機能します。
どうして?
これを修正するには、一時変数を使用します。
var tmp = aa[i];
...
m => m.PresId == tmp
あなたのwhere句には
m => m.PresId == aa[i]
これは、ラムダ式を表現する方法です。それが式に変換され、データベースのクエリに変換されると、aa[i]
、これは配列へのインデックスです。 つまり、定数として扱わない。データベース言語へのインデクサーの翻訳は不可能であるため、エラーが発生します。
どうやら、式ツリー内でarray index (aa[i])
を使用すると、それも式に変換しようとします。
別の変数を使用して回避するだけです:
int presId = aa[i];
Presentation press = context.Presentations.Where(m => m.PresId == presId).FirstOrDefault();
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;
}
これを試して
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;
}
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
}
「短いスタイル」ですが、他の多くの関数を記述する場合はお勧めしません。
エラーを回避するために単純化できます:
public List<string> GetpathsById(List<long> id)
{
return context.Presentations.Where(x => id.Contains(x.PresId)).Select(x => x.FilePath).ToList();
}