지난 며칠 동안 다음 쿼리를 최적화하는 방법과 많은 행운이없는 방법을 파악하려고했습니다. 바로 지금 내 테스트 db는 중첩 된 데이터가 거의없는 약 300 개의 레코드를 반환하지만 실행하는 데 4-5 초가 걸리고 LINQ에서 생성되는 SQL은 너무 길기 때문에 여기에 포함하기에는 너무 길다. 어떤 제안이라도 대단히 감사 할 것입니다.엔티티 프레임 워크 시간 초과
이 쿼리를 요약하면 현재 상태가있는 클라이언트 목록의 다소 평평한 "스냅 샷"을 반환하려고합니다. 당사자는 역할이있는 하나 이상의 클라이언트 (ASPNET 역할 공급자)를 포함하고, 업무 일지는 당사자의 모든 클라이언트에 대한 마지막 1 개의 업무 일지 항목을 반환하며, 작업도 마찬가지이며 LastLoginDate, 따라서 OrderBy 및 FirstOrDefault 기능을 포함합니다.
Guid userID = 'some user ID'
var parties = Parties.Where(p => p.BrokerID == userID).Select(p => new
{
ID = p.ID,
Title = p.Title,
Goal = p.Goal,
Groups = p.Groups,
IsBuyer = p.Clients.Any(c => c.RolesInUser.Any(r => r.Role.LoweredName == "buyer")),
IsSeller = p.Clients.Any(c => c.RolesInUser.Any(r => r.Role.LoweredName == "seller")),
Journal = p.Clients.SelectMany(c => c.Journals).OrderByDescending(j => j.OccuredOn).Select(j=> new
{
ID = j.ID,
Title = j.Title,
OccurredOn = j.OccuredOn,
SubCatTitle = j.JournalSubcategory.Title
}).FirstOrDefault(),
LastLoginDate = p.Clients.OrderByDescending(c=>c.LastLoginDate).Select(c=>c.LastLoginDate).FirstOrDefault(),
MarketingPlanCount = p.Clients.SelectMany(c => c.MarketingPlans).Count(),
Task = p.Tasks.Where(t=>t.DueDate != null && t.DueDate > DateTime.Now).OrderBy(t=>t.DueDate).Select(t=> new
{
ID = t.TaskID,
DueDate = t.DueDate,
Title = t.Title
}).FirstOrDefault(),
Clients = p.Clients.Select(c => new
{
ID = c.ID,
FirstName = c.FirstName,
MiddleName = c.MiddleName,
LastName = c.LastName,
Email = c.Email,
LastLogin = c.LastLoginDate
})
}).OrderBy(p => p.Title).ToList()