You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将聚合函数传入LINQ查询以实现通用查询方法

解决可传入聚合函数的查询方法问题

我来帮你搞定这个问题!你的思路非常棒——把重复的查询逻辑抽出来,只让聚合操作可配置,但当前代码有个关键疏漏:你只是把委托filter直接赋值给了Total,并没有调用这个委托并传入分组后的数据集。

修正后的核心代码

首先调整ExecQuery方法里的select部分,把分组后的结果j传给filter函数:

public void ExecQuery(Func<IEnumerable<testtable>, float?> filter)
{
    var results = from a in testtable
                  group a by a.TransactionDate.Month into j
                  select new 
                  {
                      Month = j.Key,
                      Total = filter(j) // 这里要调用委托并传入分组数据
                  };
    // 这里可以添加对results的后续处理,比如返回、打印等
}

正确的调用方式

现在你就可以像预期那样调用这个方法了,比如:

// 求和
ExecQuery(c => c.Sum(a => a.Price));

// 求平均值
ExecQuery(c => c.Average(a => a.Price));

// 求最大值
ExecQuery(c => c.Max(a => a.Price));

进阶优化:支持多种返回类型

如果你的聚合操作可能返回不同的可空值类型(比如int?、double?),可以把方法改成泛型,让它更灵活:

public void ExecQuery<T>(Func<IEnumerable<testtable>, T> filter) where T : struct?
{
    var results = from a in testtable
                  group a by a.TransactionDate.Month into j
                  select new 
                  {
                      Month = j.Key,
                      AggregatedValue = filter(j)
                  };
    // 后续处理逻辑
}

这样调用的时候就可以适配不同的聚合结果类型:

// 统计数量(返回int?)
ExecQuery(c => (int?)c.Count());

// 求最小值(返回double?)
ExecQuery(c => c.Min(a => (double?)a.Price));

内容的提问来源于stack exchange,提问作者keitn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:19:28