以后添加where子句时可以获得不同的结果

时间:2015-07-14 14:06:49

标签: c# linq where-clause iqueryable

我在结果方面遇到变化,具体取决于我何时指定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语句应用于该列表。

1 个答案:

答案 0 :(得分:2)

是的,是的,你是。

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