Этот запрос был написан в нашей системе некоторое время назад, но производительность этого запроса ухудшается при небольшом увеличении объема данных. В моем исследовании показано (CodeCount
), где запрос запускает другой подзапрос, вызывающий значительную задержку в выполнении. Мне нужно оптимизировать этот запрос Linq. любая помощь будет высоко оцененSubQuery и Group by in 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, это не значит, что это лучший способ сделать это. –