在我的新项目中,我写了很多linq。 我有很多像这样的linq查询:
...
group new {A, B} by new {....}
into g
// Calculate select claw
let SumVal1 = g.Sum(x => x.A.Value1 * func(x.A, x.B)) / g.Sum(x => func(x.A, x.B))
let SumVal2 = g.Sum(x => x.A.Value2 * func(x.A, x.B)) / g.Sum(x => func(x.A, x.B))
let SumVal3 = g.Sum(x => x.A.Value3 * func(x.A, x.B)) / g.Sum(x => func(x.A, x.B))
....
// Here could be some calculation, that are not patterned, like:
let NotPatternedSum1 = g.Sum(x => x.A.Duration)
...
select new {SumVal1, SumVal2, SumVal3, ..., NotPatternedSum, ...}
我该如何简化?我有很多关于这种模式的查询(Sum(A * func)/ Sum(func)) - 如何将它引入单个方法或委托?
也许你已经看到了一些设计大型linq查询的建议?我的代码由95%linq组成(我将db逻辑移动到客户端)。请给我一些提示,也许是非常重要的=)
我想避免使用非匿名类型
答案 0 :(得分:4)
像这样的东西(假设int
值;希望你的大多数值都是相同的类型 - 一般来说这很痛苦。)
public static int DividingSum<T>(this IEnumerable<T> source,
Func<T, int> f1, Func<T, int> f2)
{
return source.Sum(t => f1(t) * f2(t)) / source.Sum(t => f2(t));
}
如果可能,请提出比f1
和f2
更好的名称:)
通话:
let SumVal1 = g.DividingSum(x => x.A.Value1, func)
这假设LINQ to Objects ... LINQ to SQL(或实体)会使这更难,但可能并非不可能。
编辑:回复评论,您只需将通话更改为:
let SumVal1 = g.DividingSum(x => x.A.Value1, x => func(x.A, x.B))