私は過去数日間、次のクエリを最適化する方法を見つけようとしていましたが、あまり運がありませんでした。現在、私のテストデータベースはネストされたデータがほとんどない約300レコードを返していますが、実行に4〜5秒かかり、LINQによって生成されるSQLは非常に長いです(ここに含めるには長すぎます)。任意の提案をいただければ幸いです。
このクエリを要約すると、現在のステータスを持つクライアントリストのやや平坦化された「スナップショット」を返そうとしています。パーティーには、ロール(ASPNETロールプロバイダー)を持つ1つ以上のクライアントが含まれ、Journalはパーティー内のすべてのクライアントの最後の1つのジャーナルエントリを返します。同じことがTaskと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()