Тип узла выражения LINQ 'ArrayIndex' не поддерживается в LINQ to Entities - PullRequest
56 голосов
/ 02 декабря 2011
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 ]

85 голосов
/ 02 декабря 2011

Чтобы исправить это, используйте временную переменную:

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

В вашем предложении where у вас есть

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

, который является способом выражения лямбда-выражения. Когда это преобразуется в выражение, а затем преобразуется в запрос в вашей базе данных, он находит aa[i], который является индексом в массиве. т.е. он не рассматривает это как константу . Поскольку перевод индексатора на язык вашей базы данных невозможен, выдает ошибку.

14 голосов
/ 02 декабря 2011

Очевидно, что если вы используете array index (aa[i]) внутри дерева выражений, оно также пытается преобразовать это в выражение.

Просто обойдите его, используя отдельную переменную:

int presId = aa[i];
Presentation press = context.Presentations.Where(m => m.PresId == presId).FirstOrDefault();
5 голосов
/ 02 декабря 2011
 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;
}

попробуйте это

2 голосов
/ 02 декабря 2011

Он не может быть сопоставлен с типом или функцией 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; 
} 
1 голос
/ 08 мая 2013
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
} 

«Короткий стиль», но не рекомендуется, если вы пишете много других функций.

0 голосов
/ 03 августа 2018

Можно упростить, чтобы избежать ошибки:

public List<string> GetpathsById(List<long> id)
{
    return context.Presentations.Where(x => id.Contains(x.PresId)).Select(x => x.FilePath).ToList();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...