我正在尝试使用linq从EF Core数据集中过滤某些行,但我不明白为什么过滤IEnumerable与过滤IQueryable会给我带来不同的结果。
var query = _db.Jobs
.IsDelivered()
.Include(a => a.JobExtras)
.Include(a => a.Tips)
.Include(a => a.Payments)
.HasPayments();
var query1 = query
.ToList()
.Where(a => a.Payments.Sum(b => b.Amount)
- a.Price.Value
- a.Discount
- a.JobExtras.Sum(c => c.Price)
- a.Tips.Sum(d => d.Amount)
> 0);
var query2 = query
.Where(a => a.Payments.Sum(b => b.Amount)
- a.Price.Value
- a.Discount
- a.JobExtras.Sum(c => c.Price)
- a.Tips.Sum(d => d.Amount)
> 0);
Debug.WriteLine($"Record Count[Before Where Clause]: {query.Count()}");
Debug.WriteLine($"Record Count[ToList() version]: {query1.Count()}");
Debug.WriteLine($"Record Count[w/out ToList()]: {query2.Count()}");
Run Code Online (Sandbox Code Playgroud)
这是输出:
Record Count[Before …Run Code Online (Sandbox Code Playgroud) 我确信对此有一个简单的答案,但我似乎无法确定。
我有以下代码,
internal override async Task FetchDataModel()
{
var dateCutoff = DateTime.Today.AddDays(-PeriodInDays);
var query = this.DB.Jobs
.IsDelivered()
.Where(x => x.DeliveredTime.Value.Date >= dateCutoff)
.GroupBy(x => new { x.Pet.OwnerId, x.Pet.Owner.First, x.Pet.Owner.Last })
.Select(x => new MVPCustomerDTO
{
OwnerId = x.Key.OwnerId,
OwnerName = $"{x.Key.First} {x.Key.Last}",
JobCount = x.Count(),
TotalSpend = x.Sum(a => (a.Price ?? 0M) - a.Discount)
+ this.DB.JobExtras
.Where(a => a.Job.Pet.OwnerId == x.Key.OwnerId)
.Where(a => a.Job.DeliveredTime.Value.Date >= dateCutoff)
.Sum(a => a.Price),
})
/*==>Problem Line*/ .OrderByDescending(x => x.TotalSpend)
.Take(25);
var result = await …Run Code Online (Sandbox Code Playgroud)