Тип узла выражения 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   51   2011-12-02 13:03:03

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();
}