gpt4 book ai didi

c# - 动态过滤linq lambda表达式

转载 作者:行者123 更新时间:2023-11-30 15:05:13 26 4
gpt4 key购买 nike

我目前正在尝试执行以下操作。

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(),那么该语句很慢而嵌套循环很快。

我的问题是:

是否可以根据这些 StatusId 和 PriorityId 动态地从一开始就过滤组?怎么办?

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 访问它。

最佳答案

所有这些都应该发生在数据库中。只需创建一个连接所有这些表的 View 。在交叉和连接数据集时很难比数据库更快。

关于c# - 动态过滤linq lambda表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9243706/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com