稍后添加 where 子句时可查询不同的结果
IQueryable different results when adding where clause later
我在指定 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 方法是用 where 子句包装整个 IQueryable 而不是将 where 子句添加到 IQueryable 中(这将导致 IQueryable 与 query1 相同),我是否正确?这似乎是唯一合乎逻辑的解释。
在此之前 'revelation' 我本以为要获得 1 个结果 (query2),我必须使用 .ToList() 评估 query2,然后将 where 语句应用于该列表。
是的,你是。
或稍微长一点的形式:第二个示例创建一个 IQueryable,然后通过 Where 方法进一步操作它,因此您从第一个 IQueryable 获得的所有内容都将被过滤,而不是在您的第一个中进行过滤询问。目前尚不清楚为什么这实际上 returns 不同的结果,但在第二个示例中,分组发生在 之前 过滤,这可能很重要。
我在指定 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 方法是用 where 子句包装整个 IQueryable 而不是将 where 子句添加到 IQueryable 中(这将导致 IQueryable 与 query1 相同),我是否正确?这似乎是唯一合乎逻辑的解释。
在此之前 'revelation' 我本以为要获得 1 个结果 (query2),我必须使用 .ToList() 评估 query2,然后将 where 语句应用于该列表。
是的,你是。
或稍微长一点的形式:第二个示例创建一个 IQueryable,然后通过 Where 方法进一步操作它,因此您从第一个 IQueryable 获得的所有内容都将被过滤,而不是在您的第一个中进行过滤询问。目前尚不清楚为什么这实际上 returns 不同的结果,但在第二个示例中,分组发生在 之前 过滤,这可能很重要。