這種查詢是寫在我們的系統中,前一段時間,但此查詢的表現越來越差,在數據略有增加。我的調查顯示(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中完成它並不意味着它是最好的方法。 –