IQueryable的的实体。凡(属性是在本地阵列)是在、阵列、实体、属性

2023-09-04 09:46:14 作者:悲喜都是你

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

但是,这就是我想要做的:

  INT [] alreadySelectedIds = ...
变种受试者= Entities.NewInstance.Subjects.Where(X => Array.IndexOf(alreadySelectedIds,x.Id)==  -  1).ToList();
 

和阅读后这样的下方,我安慰了EF5应该能够把这种。 Getting实体的按键匹配列表(或数组)的IDS 使用LINQ to查询诠释IDS从数组

不过,我得到这个错误:

  

LINQ到实体不能识别方法的Int32   的IndexOf [的Int32](的Int32 [],的Int32)'方法,和这种方法不能   翻译成一家商店前pression。

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

我也尝试

  VAR newSubjects = Entities.NewInstance.Subjects.Where(X => alreadySelectedIds.Contains(x.Id))。了ToList();
 
UG中如何给实体进行线性阵列

  

无法创建类型'System.Int32的[]'空恒定值。只要   实体类型,枚举类型或原始类型的支持   这方面

 名单,其中,INT> alreadySelectedIds = ...
 

  

无法创建类型的空常量'System.Collections.Generic.List`1。只有实体类型,枚举类型或基本类型在这方面的支持。

我坚持我的大脑越来越肉麻超出允许任何类型的优雅的恢复。谁能好心救我?

解决方案

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

应该工作,如果 alreadySelectedIs 不为空

您可以做一个空检查内部或查询之前:

  Entities.NewInstance.Subjects.Where(X => alreadySelectedIds == NULL
                                         ?对或错
                                         :alreadySelectedIds.Contains(x.Id)
                                    ).ToList();
 

(可重写,这取决于如果你想全有或全无,如果 alreadySelectedIds 为null)

  //返回所有,如果空
X => alreadySelectedIds == NULL || alreadySelectedIds.Contains(x.Id)
 

 如果空//返回任何结果
X => alreadySelectedIds = NULL和放大器;!&安培; alrreadySelectedIds.Contains(x.Id)
 

So I know that iQueryables are translated into SQL statements and thus cannot handle all possible methods that you might put into a where clause.

But this is what I'm trying to do:

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

And reading post like these below, I'm comforted that EF5 should be able to translate this. Getting Entities whose keys match list(or array) of ids Using LINQ To Query Int Ids From An Array

However, I'm getting this error:

LINQ to Entities does not recognize the method 'Int32 IndexOf[Int32](Int32[], Int32)' method, and this method cannot be translated into a store expression.

And googling this error does not give me much help.

I have also tried

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

Unable to create a null constant value of type 'System.Int32[]'. Only entity types, enumeration types or primitive types are supported in this context.

and

List<int> alreadySelectedIds = ...

Unable to create a null constant value of type 'System.Collections.Generic.List`1'. Only entity types, enumeration types or primitive types are supported in this context.

I'm stuck and my brain is getting mushy beyond the possibility for any type of graceful recovery. Can anyone kindly save me?

解决方案

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

should work, if alreadySelectedIs is not null

you can do a null check inside or before your query :

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

(which can be rewritten, depending if you want all or nothing if alreadySelectedIds is null)

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

or

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