6

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

但这就是我想要做的:

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

阅读下面这样的帖子,我很欣慰 EF5 应该能够翻译这个。使用 LINQ 从数组中查询 Int Id
获取键与 id 列表(或数组)匹配的实体

但是,我收到此错误:

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

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

我也试过

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

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

List<int> alreadySelectedIds = ...

无法创建类型为“System.Collections.Generic.List`1”的空常量值。此上下文仅支持实体类型、枚举类型或原始类型。

我被困住了,我的大脑变得糊状,超出了任何优雅恢复的可能性。任何人都可以救我吗?

4

1 回答 1

6
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)
于 2013-09-04T15:42:19.623 回答