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

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

但这就是我要做的事情:

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

阅读下面的post,我很高兴EF5应该能够翻译这个。
获取其键匹配id列表(或数组)的实体
使用LINQ从数组查询Int ID

但是,我收到此错误:

LINQ to Entities无法识别方法’Int32 IndexOf [Int32](Int32 [],Int32)’方法,并且此方法无法转换为存储表达式。

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

我也试过了

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

无法创建类型为“System.Int32 []”的空常量值。 在此上下文中仅支持实体类型,枚举类型或基元类型。

 List alreadySelectedIds = ... 

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

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

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

应该工作,如果alreadySelectedIs不为null

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

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

(可以重写,如果你想要全部或者没有,如果alreadySelectedIds为null)

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

要么

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