Выражение LINQ node типа '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, он работает.
Почему?
Ответы
Ответ 1
Чтобы исправить это, используйте временную переменную:
var tmp = aa[i];
...
m => m.PresId == tmp
В вашем разделе where у вас есть
m => m.PresId == aa[i]
который является способом выражения лямбда-выражения. Когда это преобразуется в выражение, а затем преобразуется в запрос в вашей базе данных, он находит aa[i]
, который является индексом в массив. т.е. он не рассматривает его как константу. Поскольку перевод индексатора на ваш язык базы данных невозможен, он дает ошибку.
Ответ 2
По-видимому, если вы используете array index (aa[i])
внутри дерева выражений, он также пытается преобразовать это в выражение.
Просто обходите его, используя отдельную переменную:
int presId = aa[i];
Presentation press = context.Presentations.Where(m => m.PresId == presId).FirstOrDefault();
Ответ 3
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;
}
попробуйте это
Ответ 4
Невозможно сопоставить тип или функцию 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;
}
Ответ 5
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
}
"Короткий стиль", но не рекомендуется, если вы пишете много другой функции.