如何将聚合函数传入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
相关产品推荐
相关产品推荐

