C# 意外-无法比较类型为';System.Int32[]和#x27;。仅支持基元类型、枚举类型和实体类型

C# 意外-无法比较类型为';System.Int32[]和#x27;。仅支持基元类型、枚举类型和实体类型,c#,.net,entity-framework,lambda,C#,.net,Entity Framework,Lambda,你知道EF DbContext查询的问题是什么吗?据我所知,这应该是一个可行的办法 我试过列表,空的,非空的检查,都没有用。但是,如果我删除空检查并只保留Contains(),查询确实有效。但是,如果testid为null,则需要返回所有记录 var testIDs = new int[] { 1, 3 }; var test = session.All<VendorBooking>(x => testIDs == null || testIDs.Contains(x.Vend

你知道EF DbContext查询的问题是什么吗?据我所知,这应该是一个可行的办法

我试过列表,空的,非空的检查,都没有用。但是,如果我删除空检查并只保留
Contains()
,查询确实有效。但是,如果testid为null,则需要返回所有记录

var testIDs = new int[] { 1, 3 };
var test = session.All<VendorBooking>(x => testIDs == null || testIDs.Contains(x.VendorServiceID)).ToList();
var testIDs=newint[]{1,3};
var test=session.All(x=>testIDs==null | | testIDs.Contains(x.VendorServiceID)).ToList();
(session.All仅使用
context.Set.Where()

在中引发异常:“System.NotSupportedException” EntityFramework.SqlServer.dll

其他信息:无法比较类型的元素 “System.Int32[]”。仅原语类型、枚举类型和实体 类型是受支持的


非常感谢

testid
不能为空,因此请尝试此方法

var testIDs = new int[] { 1, 3 };
var test = session
   .All<VendorBooking>(x => testIDs.Contains(x.VendorServiceID))
   .ToList();
var testIDs=newint[]{1,3};
var测试=会话
.All(x=>testIDs.Contains(x.VendorServiceID))
.ToList();
修订版

var results = (testIds == null || testIds.Length == 0)
  ? session.All<VendorBooking>()
  : session.All<VendorBooking>(x => testIDs.Contains(x.VendorServiceID));
var test = results.ToList();
var results=(testIds==null | | testIds.Length==0)
? 全体会议()
:session.All(x=>testIDs.Contains(x.VendorServiceID));
var test=results.ToList();

可能是这样的。此外,您还可以提取常用零件并将其缩短

var testIDs = new int[] { 1, 3 };
if (testIDs == null)
{
    var test = session.All<VendorBooking>()
        .ToList();
}
else
{
    var test = session.All<VendorBooking>(x => testIDs.Contains(x.VendorServiceID))
       .ToList();
}
var testIDs=newint[]{1,3};
if(testIDs==null)
{
var test=session.All()
.ToList();
}
其他的
{
var test=session.All(x=>testIDs.Contains(x.VendorServiceID))
.ToList();
}
var test=session.All(x=>testIDs.Contains()==0 | |
testIDs.Contains(x.VendorServiceID)).ToList();

这是正常工作。不要被OR运算符弄糊涂,因此只有一个条件必须为
true
,完整表达式才能为
true
<当任何值被传递到
testIDs
时,code>testIDs.Contains(x.VendorServiceID)的计算结果为
true
,否则
testIDs.Contains()==0
在传递null时为true。

您使用什么版本的EF和.net?EntityFramework v6.1.3(最新AFAIK),.NET 4.5.1如果排除此检查,我如何返回睾丸为空的所有记录?看起来@Backs有您的答案。谢谢Richard。我明白了。或者通过if/else将其附加到Where()子句。好主意。谢谢我对EF非常惊讶,我认为数组的空检查应该从根本上得到支持。@GONeale有时候EF很奇怪,yes@GONeale我想,我有一个想法,为什么会这样。在c#(.net)中,我们有集合(数组、列表等),但在sql server中没有集合。因此,linq2sql无法将集合传递给服务器以检查它是否为空。我认为在EF中准备查询时,它只会识别数组“testIDs==null”,并知道如何将其写入
1=1或(1,2)
等。。在T-SQL中。我认为,如果英孚团队采用这一功能,这是可以做到的。
    var test = session.All<VendorBooking>(x => testIDs.Contains()==0 || 
    testIDs.Contains(x.VendorServiceID)).ToList();