Тип узла выражения 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.
однако, если я поставлю x вместо aa[i] это работает.
Почему?
6 ответов:
исправить это используйте временную переменную:
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(); }
Comments