我想以EF核心方式以最快的速度从数据库查询多个聚合值,我找到了Entity Framework multiple counts with a single query并尝试了
public Task<VouchersUsageMetrics> BuildVouchersUsageMetrics(
IQueryable<Voucher> vouchers,
VoucherSetting voucherSetting,
CancellationToken cancellationToken)
{
var startOfToday = this.dateTimeProvider.GetStartOfDay(this.dateTimeProvider.Now);
return vouchers
.Select(it => SelectExpressions.GetVoucherStatus.Invoke(it, startOfToday))
.GroupBy(
it => 1,
(groupId, groupItems) =>
new VouchersUsageMetrics(
voucherSetting.TotalPrepaidCount,
voucherSetting.MaxAvailablePostpaidCount)
{
Expired = groupItems.Count(it => it == (long)VoucherStatusEnum.Expired),
Assigned = groupItems.Count(it => it == (long)VoucherStatusEnum.Assigned),
Requested = groupItems.Count(it => it == (long)VoucherStatusEnum.Requested),
})
.FirstOrDefaultAsync(cancellationToken);
}
但是我遇到下一个错误:
System.InvalidOperationException:LINQ表达式 '(GroupByShaperExpression:KeySelector:(1), ElementSelector:(ProjectionBindingExpression:EmptyProjectionMember)) .Count(it =>(long)it == 21)'无法翻译。要么以可以翻译的形式重写查询...
我尝试过
SelectExpressions
。Select
this.context.Vouchers
,但始终具有相同的错误。我不知道为什么,:)害怕如果无法正常工作,必须使用SQL Virtual Views,但是真的不喜欢支持它们。或可能会尝试在这个地方使用精致的包装。
PS。这是如何构造传递给该方法的可查询对象
this.context.Vouchers
.AsNoTracking()
.AsExpandableEFCore()
.Where(it => it.AgencyID == 1);
PPS。使用了EF Core 3.1.1