LINQ to Entities不支持LINQ表达式节点类型'ArrayIndex'

时间:2011-12-02 09:03:04

标签: c# arrays linq entity-framework 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 个答案:

答案 0 :(得分:83)

要解决此问题,请使用临时变量:

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

在你的where子句中

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

这是表达lambda表达式的一种方式。当它转换为表达式,然后转换为数据库查询时,它会找到aa[i],它是数组的索引。的即。它不会将其视为常量。由于无法将索引器转换为数据库语言,因此会出错。

答案 1 :(得分:13)

显然,如果在表达式树中使用array index (aa[i]),它会尝试将其转换为表达式。

使用单独的变量解决它:

int presId = aa[i];
Presentation press = context.Presentations.Where(m => m.PresId == presId).FirstOrDefault();

答案 2 :(得分:4)

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

试试这个

答案 3 :(得分:2)

它无法映射到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; 
} 

答案 4 :(得分:1)

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
} 

“简短风格”,但如果你写了很多其他功能,不推荐使用。

答案 5 :(得分:0)

可以简化以避免发生错误:

public List<string> GetpathsById(List<long> id)
{
    return context.Presentations.Where(x => id.Contains(x.PresId)).Select(x => x.FilePath).ToList();
}