实体的IQueryable .Where(属性在本地数组中)

时间:2013-09-04 15:35:03

标签: c# .net linq entity-framework entity-framework-5

所以我知道iQueryables被翻译成SQL语句,因此无法处理你可能放入where子句的所有可能的方法。

但这就是我想要做的事情:

int[] alreadySelectedIds = ...
var subjects = Entities.NewInstance.Subjects.Where(x => Array.IndexOf(alreadySelectedIds, x.Id) == -1).ToList();

阅读下面的帖子,我很高兴EF5应该能够翻译它。
Getting Entities whose keys match list(or array) of ids
Using LINQ To Query Int Ids From An Array

但是,我收到了这个错误:

  

LINQ to Entities无法识别方法'Int32   IndexOf [Int32](Int32 [],Int32)'方法,而且这个方法不能   翻译成商店表达。

谷歌搜索这个错误并没有给我太多帮助。

我也试过

var newSubjects = Entities.NewInstance.Subjects.Where(x => alreadySelectedIds.Contains(x.Id)).ToList();
  

无法创建类型为“System.Int32 []”的null常量值。只要   支持实体类型,枚举类型或基元类型   这个背景。

List<int> alreadySelectedIds = ...
  

无法创建类型为'System.Collections.Generic.List`1'的空常量值。在此上下文中仅支持实体类型,枚举类型或基元类型。

我被困住了,我的大脑变得糊涂,超出了任何类型的优雅康复的可能性。有人可以救我吗?

1 个答案:

答案 0 :(得分:4)

Entities.NewInstance.Subjects.Where(x => alreadySelectedIds.Contains(x.Id)).ToList();
如果alreadySelectedIs不为空

,则

应该有效

您可以在查询内部或之前进行空检查:

Entities.NewInstance.Subjects.Where(x => alreadySelectedIds == null 
                                         ? true // or false 
                                         : alreadySelectedIds.Contains(x.Id)
                                    ).ToList();

(如果alreadySelectedIds为空,则可以重写,具体取决于您是否需要全部或全部)

//return all if null
x => alreadySelectedIds == null || alreadySelectedIds.Contains(x.Id)

//return nothing if null
x => alreadySelectedIds != null  && alrreadySelectedIds.Contains(x.Id)