【发布时间】:2013-06-04 11:37:52
【问题描述】:
这个查询是不久前在我们的系统中编写的,但是随着数据的一点点增加,这个查询的性能变得很差。我的调查显示 (CodeCount) 查询触发另一个子查询导致执行的大量延迟。我需要优化这个 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 中执行此类查询。
-
我同意埃瓦尔德的观点。甚至可以将其制成一个视图,然后您可以在 LINQ 中更轻松地选择它。很多时候,仅仅因为你可以在 LINQ 中做到这一点并不意味着它是最好的方法。
标签: c# asp.net .net linq linq-to-sql