我正在嘗試執行以下操作。動態過濾linq lambda表達式
var groups = MileId == null ? test.Groups.Where(x => x.ProjectId == ProjectId)
: test.Groups.Where(x => x.Milestone == MileId &&
x.ProjectId == ProjectId);
但我也有我需要通過篩選組附加條款:
foreach (var ChartItem in ChartItems)
{
foreach (var StatusItem in ChartItem.ChartStatusItems)
{
foreach (var PriorityItem in StatusItem.ChartPriorityItems)
{
filteredgroups.AddRange(
groups.Where(x => x.Status == StatusItem.StatusID
&& x.Priority == PriorityItem.PriorityID));
}
}
}
這無關緊要,它的工作原理,但添加範圍時嵌套的foreach循環是相當緩慢的。如果我在循環之前對groups.toList()進行處理,那麼該語句很慢並且嵌套循環很快。
我的問題是:
是否可以從基於這些StatusIds和PriorityIds動態開始篩選羣體?怎麼樣?
Stackoverflow推薦一些基於我的主題行的表達式樹的文章...是我需要看什麼?
謝謝
編輯:
所以我現在這樣做:
foreach (var ChartItem in ChartItems)
{
foreach (var StatusItem in ChartItem.ChartStatusItems)
{
foreach (var PriorityItem in StatusItem.ChartPriorityItems)
{
var groups = MileId == null ? test.Groups.Where(x => x.ProjectId == InspectorProjectId &&
x.Status == StatusItem.StatusID &&
x.Priority == PriorityItem.PriorityID)
: test.Groups.Where(x => x.Milestone == InspectorMileId &&
x.ProjectId == InspectorProjectId &&
x.Status == StatusItem.StatusID &&
x.Priority == PriorityItem.PriorityID);
filteredgroups.AddRange(groups);
}
}
}
這是一個很大的進步,但它仍然要爲每個優先級慢「測試」服務器。如果我能把它全部過濾掉,這將是理想的。
編輯2:哦,我沒有訪問數據庫直接:(我們通過API訪問
什麼是'test.Groups'?那是訪問一個數據庫嗎?列表中包含的項目大約有多少? – svick 2012-02-11 20:31:53
是的,這是正確的,test.groups正在訪問一個數據庫。過濾之前,組包含約10k項目。 – Robodude 2012-02-11 20:33:08