稍后添加where子句时可查询不同的结果

本文关键字:查询 结果 添加 where 子句 | 更新日期: 2023-09-27 18:02:50

我正在经历结果的变化,这取决于我何时指定where子句…

如果我使用:

query1 = from ct in CustomerTransfers
         join j in Jobs on ct.Stock.JobNo equals j.JobNo
         join o in Organisations on j.OrganisationId equals o.OrganisationId into oGroup
         from o in oGroup.DefaultIfEmpty()
         where ct.OrganisationId == intCustomerB &&
                  ct.NewOrganisationId == intCustomerA
         group new { ct, j, o } by ct.WedNo into g
         let largestValue = g.OrderByDescending(x => x.ct.TransferNo).FirstOrDefault()
         select new
         {
             Id = g.Key,
             OrganisationId = largestValue.ct.OrganisationId,
             NewOrganisationId = largestValue.ct.NewOrganisationId,
         };
query1.ToList();

给出两个结果…但是如果我从最初的IQueryable结构中删除以下内容:

where ct.OrganisationId == intCustomerB &&
ct.NewOrganisationId == intCustomerA

,然后使用where子句将它们立即添加进来,如下所示:

query2 = from ct in CustomerTransfers
         join j in Jobs on ct.Stock.JobNo equals j.JobNo
         join o in Organisations on j.OrganisationId equals o.OrganisationId into oGroup
         from o in oGroup.DefaultIfEmpty()
         group new { ct, j, o } by ct.WedNo into g
         let largestValue = g.OrderByDescending(x => x.ct.TransferNo).FirstOrDefault()
         select new
         {
             Id = g.Key,
             OrganisationId = largestValue.ct.OrganisationId,
             NewOrganisationId = largestValue.ct.NewOrganisationId,
         };
query2 = query2.Where (q => q.OrganisationId == intCustomerB && q.NewOrganisationId == intCustomerA);
query2.ToList();

我得到一个结果。

所以我在假设使用query2方法它是包装整个IQueryable与where子句,而不是添加where子句到IQueryable(这将导致一个IQueryable相同的query1)正确吗?这似乎是唯一合乎逻辑的解释。

在此"启示"之前,我本以为要获得1个结果(query2),我必须使用. tolist()对query2进行评估,然后对该列表应用where语句。

稍后添加where子句时可查询不同的结果

是的,是的,你是。

或者以稍微长一点的形式:第二个示例创建了一个IQueryable,然后由Where方法进一步操作,因此您从第一个IQueryable中获得的所有内容都被过滤,而不是在第一个查询中进行过滤。目前还不清楚为什么这实际上返回不同的结果,但在第二个示例中,分组在过滤之前发生,这可能很重要。