这种查询是写在我们的系统中,前一段时间,但此查询的表现越来越差,在数据略有增加。我的调查显示(CodeCount
)查询触发另一个子查询导致执行大量延迟。我需要优化这个Linq查询。任何帮助将不胜感激子查询和集团在LINQ
from batch in Context.VoucherCodeBatch.ToList()
join type in Context.VoucherCodeType on batch.VoucherTypeId equals type.VoucherTypeId
join voucher in Context.Voucher on batch.VoucherCodeBatchId equals voucher.VoucherCodeBatchId
where batchIds.Contains(batch.BatchCode)
group new
{
batch.BatchCode,
batch.CreationDate,
type.VoucherTypeName,
voucher.AllowedCount,
voucher.ValidFrom,
voucher.ValidTo,
batch.VoucherCodeBatchId,
voucher.VoucherCode
}
by new { batch.BatchCode }
into uniquebatch
select new Batch
{
BatchCode = uniquebatch.FirstOrDefault().BatchCode,
CreationDate = uniquebatch.FirstOrDefault().CreationDate,
TimesAllowed = uniquebatch.FirstOrDefault().AllowedCount,
ValidFrom = uniquebatch.FirstOrDefault().ValidFrom,
CodeCount = ((from c in Context.Voucher.ToList()
where
c.VoucherCodeBatchId ==
uniquebatch.FirstOrDefault().VoucherCodeBatchId
select c).Count()),
ValidTo = uniquebatch.FirstOrDefault().ValidTo,
CodeType = uniquebatch.FirstOrDefault().VoucherTypeName,
VoucherCodeBatchId = uniquebatch.FirstOrDefault().VoucherCodeBatchId
});
那'ToList()'在那里意味着这个查询请求* *所有从内存中的数据库和过滤器券行。尝试删除它。 –
我建议在数据库端执行SQL查询。 –
我同意Ewald。甚至可以将它制作成一个视图,然后您可以在LINQ中更轻松地进行选择。很多时候,仅仅因为你可以在LINQ中完成它并不意味着它是最好的方法。 –