LINQ to Entities不支持LINQexpression式节点types“ArrayIndex”

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

在这个代码中我有一个exachtion: The LINQ expression node type 'ArrayIndex' is not supported in LINQ to Entities.

买时,我而不是一个[我]我使用X它正在工作。

为什么?

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

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

在你的where子句中

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

这是一种expressionlambdaexpression式的方式。 当它被转换成一个expression式,然后转换成你的数据库的查询,它会发现aa[i] ,这是一个数组的索引。 即它不把它当作一个常量 。 由于将索引器转换为数据库语言是不可能的,因此会导致错误。

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

只需要使用一个单独的variables来解决它:

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

尝试这个

它不能映射到SQLtypes或函数。

你知道你正在混合你的列表和数组。 你想在这个代码中做的任何事情都可以简单地使用列表来完成。

下面的代码将完成你所需要的一切。

 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 } 

“短风格”,但不build议,如果你写了很多其他function。