이 쿼리는 이전에 우리 시스템에 작성되었지만이 쿼리의 성능은 약간의 데이터 증가로 인해 좋지 않습니다. 내 조사 결과 (CodeCount
) 쿼리에서 다른 하위 쿼리가 발생하여 실행이 많이 지연되었습니다. 이 Linq 쿼리를 최적화해야합니다. 어떤 도움은 매우 첫 번째 큰 문제를 잘 ObjectSet <의 앞에 ToList()
> (EF의 테이블 컬렉션)이다linq의 SubQuery 및 Group
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()'는이 쿼리가 데이터베이스의 모든 * 바우처 행을 요청하고 메모리의 필터를 사용한다는 것을 의미합니다. 제거해보십시오. –
나는 DB 측에서 SQL 같은 쿼리를하는 것이 좋습니다. –
나는 Ewald에 동의합니다. 어쩌면 LINQ에서 훨씬 쉽게 선택할 수있는보기로 만들 수도 있습니다. 많은 시간, LINQ에서 할 수 있다고해서 그것이 최선의 방법이라는 것을 의미하지는 않습니다. –