我正在尝试执行以下操作。动态过滤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