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

Ale*_*lex 5 .net c# 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();
Run Code Online (Sandbox Code Playgroud)

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

但是,我收到此错误:

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

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

我也试过了

var newSubjects = Entities.NewInstance.Subjects.Where(x => alreadySelectedIds.Contains(x.Id)).ToList();
Run Code Online (Sandbox Code Playgroud)

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

List<int> alreadySelectedIds = ...
Run Code Online (Sandbox Code Playgroud)

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

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

Rap*_*aus 6

Entities.NewInstance.Subjects.Where(x => alreadySelectedIds.Contains(x.Id)).ToList();
Run Code Online (Sandbox Code Playgroud)

应该工作,如果alreadySelectedIs不为空

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

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

(可以重写,这取决于你想要全部还是什么都不想要,如果alreadySelectedIds为空)

//return all if null
x => alreadySelectedIds == null || alreadySelectedIds.Contains(x.Id)
Run Code Online (Sandbox Code Playgroud)

或者

//return nothing if null
x => alreadySelectedIds != null  && alrreadySelectedIds.Contains(x.Id)
Run Code Online (Sandbox Code Playgroud)

  • 一个人怎么能在一个简单的问题上徒劳地挣扎,就因为在绝望和智力恐慌中迷失了正确理解问题的道路,这真是太神奇了。但是,一个男人除了做一个男人还能做什么呢? (3认同)