简化和设计linq查询

时间:2010-08-19 12:28:55

标签: c# linq

在我的新项目中,我写了很多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逻辑移动到客户端)。请给我一些提示,也许是非常重要的=)

我想避免使用非匿名类型

1 个答案:

答案 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));
}

如果可能,请提出比f1f2更好的名称:)

通话:

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))