【发布时间】:2021-03-04 07:12:10
【问题描述】:
在我的应用程序中,我在几个不同的地方计算几何平均值,并希望将实现放在一个地方,以减少维护者的困惑。出于性能原因,我需要在数据库中进行计算,因此不能在 C# 中获取数据并运行 GeoMean()。
但是,我不知道如何编写可以在我的代码中使用的扩展方法。查询看起来像这样:
data.GroupBy(a => a.Foo)
.Select(a => new {
Id = a.Foo,
Mean = a.GeoMean(b => b.Value)
});
我似乎已经确定我必须使用a.AsQueryable().GeoMean(),以及一个看起来像这样的扩展方法:
public static double GeoMean<T>(this IQueryable<T> source, Expression<Func<T, double>> fn)
{
return Math.Exp(source.Average(i => Math.Log(fn(i))));
}
但是,由于预计会返回 double,因此它抱怨 fn 是 Expression。如果我将返回类型更改为Expression<Func<double>>,我只是将问题移至查询中的Select,所以我可能需要对其做点什么,但是什么?
这甚至可能吗?我是否应该接受每次需要计算时都必须复制代码?
【问题讨论】:
-
这基本上涵盖了我所询问的所有内容,但不完全是。 :p 谢谢,不过。 :)