2015-07-14 2 views
1

я испытываю колебания в результатах в зависимости от того, когда я указать, где положение ...IQueryable разные результаты при добавлении где положение позже

Если я использую:

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 

и добавить их немедленно позже, используя, где положение так:

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 идентичен запросу1)? Это кажется единственным логическим объяснением.

До этого «откровения» я бы подумал, что для достижения 1 результата (query2) мне пришлось бы оценивать query2 с помощью .ToList(), а затем применять оператор where к этому списку.

ответ

2

Да, да.

Или в несколько более длинной форме: второй пример создает IQueryable, который далее управляется методом Where, поэтому все, что вы получили от первого IQueryable, фильтруется, а не фильтрация, происходящая в вашем первом запросе , Не сразу понятно, почему это фактически возвращает разные результаты, но во втором примере группировка происходит до, что может быть значительным.

+0

Ahhh ... хорошо заметили ... если различие в результатах связано с тем, что применяется группировка, то есть до или после фильтрации, она имеет общий смысл. –

+0

Группировка на самом деле говорит «дайте мне запись с max transferno», а предложение where говорит «дайте мне записи для этих организаций» ... чтобы вы могли различить, порядок, в котором они выполняются, имеет большой эффект , –

Смежные вопросы