Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The LINQ expression node type 'ArrayIndex' is not supported in 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;
}

This code throws the following exception: The LINQ expression node type 'ArrayIndex' is not supported in LINQ to Entities.

However, if I supply x instead of aa[i] it works.

Why?

like image 397
Artur Keyan Avatar asked Dec 02 '11 09:12

Artur Keyan


5 Answers

To fix this use a temporary variable:

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

In your where clause you have

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

which is a way of expressing a lambda expression. When that is converted to an expression, then converted into a query on your database it finds the aa[i], which is an index into an array. i.e. it doesn't treat it as a constant. Since a translation of an indexer to your database language is impossible it gives the error.

like image 122
George Duckett Avatar answered Nov 01 '22 16:11

George Duckett


Apparently, if you use an array index (aa[i]) inside an expression tree, it tries to convert that into an expression as well.

Just work around it by using a separate variable:

int presId = aa[i];
Presentation press = context.Presentations.Where(m => m.PresId == presId).FirstOrDefault();
like image 27
Trax72 Avatar answered Nov 01 '22 16:11

Trax72


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

try this

like image 5
Sender Avatar answered Nov 01 '22 16:11

Sender


It cannot be mapped to an SQL type or function.

You are aware you are mixing your list and array with each other. Everything you want doing in this code can be done simply using the list.

The following bit of code will do everything you need it to.

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; 
} 
like image 2
Matt Seymour Avatar answered Nov 01 '22 16:11

Matt Seymour


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

to

public IEnumerable<String> GetpathsById(List<long> id) 
{ 
    foreach(long item in id) 
        yield return = (context.Presentations.Where(m => m.PresId == item).FirstOrDefault()).FilePath
} 

"Short style", but not recomended if you write a lot of other function.

like image 1
Yauhen Kavalenka Avatar answered Nov 01 '22 14:11

Yauhen Kavalenka