为什么我在查询中出错

本文关键字:出错 查询 为什么 | 更新日期: 2023-09-27 18:15:19

我使用实体框架6。

我有这个阵列:

int?[] regionTypeId = [1,2,3];

在此查询中(linq to query(:

    var t = (from sites in context.Set<Site>()
             where regionTypeId.Contains(sites.Regions.Select(x=>x.RegionTypeId).ToList())
            select sites).AsNoTracking<Site>();

我得到这个错误:

Error 15 'int?[]' does not contain a definition for 'Contains' and the best extension method overload 'System.Linq.ParallelEnumerable.Contains<TSource>(System.Linq.ParallelQuery<TSource>, TSource)' has some invalid arguments    

知道怎么修吗?

为什么我在查询中出错

扩展方法Contains(this IEnumerable<int?> source, int value?):bool不接受List<int>List<int?>,但在这种情况下只接受Nullable int,也就是int?

问题出在您的声明上,以下代码对我来说很好:

int someValue=1;
int?[] regionTypeId =  { 1, 2, 3 };
if (regionTypeId.Contains(someValue))
{
   // code here
}

您收到此错误是因为您正在尝试执行int?[].Containts(List<int>)。下次指定整个错误。

'int?[]"不包含"Contains"和最佳扩展方法过载'可查询。包含>(IQueryable>,List('需要类型为"IQueryable>"的接收器

为什么不把你的int?[]变成int[]并在linq中使用呢。

 var result = regionTypeId.Where(x => x != null).Cast<int>().ToArray();

然后你的linq:

  var t = (from sites in context.Set<Site>()
         where result.Contains(sites.Regions.Select(x=>x.RegionTypeId).ToList())
        select sites).AsNoTracking<Site>();
int[] regionTypeId = new int[] {1,2,3};
var t = (from sites in context.Set<Site>()
    where regionTypeId.Contains(sites.Regions.Select(x=>x.RegionTypeId))
    select sites).AsNoTracking<Site>();
  1. 修复了int数组
  2. 对于ToList,将在数据库服务器上评估包含块

Tinwor是唯一一个发现您没有执行预期。。。

regionTypeId.Contains(someInteger)

但是

regionTypeId.Contains(some IEnumerable<int>)

这显然是错误的参数。但他没有展示正确的替代方案,即

var t = from site in context.Set<Site>().AsNoTracking()
        where site.Regions.Any(x => regionTypeId.Contains(x.RegionTypeId))
        select site;

这检查站点是否至少有一个Region,其RegionTypeIdregionTypeId中。