我有一個LINQ查詢,我在優化時遇到了麻煩,需要大約5.5秒的時間才能運行。我使用名爲StaffingResourceData的視圖和名爲StaffingForecasts的表。優化緩慢的LINQ查詢
每個StaffingResource都有一個ResourceId,一個Division和一個Type。 StaffingForecast具有ResourceId,Project,Date(表示一週的星期一),Hours。 StaffingResource可以有0多個StaffingForecasts。
對於每個StaffingResource,我需要一個未來12周的總預測小時數列表。這是我現在所擁有的:
// Get list of dates
var dates = new List<DateTime>();
var start = Utilities.GetStartOfWeek(DateTime.Today);
for (var i = 0; i < 12; i++)
{
dates.Add(start.AddDays(i * 7));
}
var end = dates[11];
// Get resources
var resources = (from r in context.StaffingResourceDatas
where r.EmployeeId != null
&& !exclusionList.Contains(r.ResourceTitleId)
join f in context.StaffingForecasts.Where(x => x.Date >= start && x.Date <= end) on r.ResourceId equals f.ResourceId into g1
from f in g1.DefaultIfEmpty()
group new { f.Date, f.Hours } by r into g2
select new ChartResourceModel
{
ResourceId = g2.Key.ResourceId,
Division = g2.Key.ResourceDivision,
Type = g2.Key.ResourceType,
Dates = dates.Select(d => new ChartDateModel
{
Date = d,
Available = (g2.Where(f => f.Date == d).Any() ? g2.Where(f => f.Date == d).Sum(f => f.Hours) : 0) < 24
}).ToList()
})
.ToList();
關於如何加快速度的任何想法?
[CodeReview.SE]會更好嗎? –
那麼,如果沒有真正回答你的問題,你可以使用'Where(f => f.Date == d).Any()'來替代'Any'的重載'Func':'Any(f => f .Date == d)' – HimBromBeere
看看正在生成的SQL,至少會給你一個啓動。 – DavidG