C# 简化和设计linq查询

C# 简化和设计linq查询,c#,linq,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)) /

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

我希望避免使用类似的非匿名类型(假设
int
值;希望您的大多数值都使用相同的类型-通常这样做很痛苦)

这是假设LINQ对对象。。。LINQ到SQL(或实体)将使这变得更加困难,但可能并非不可能

编辑:回应评论,您只需将呼叫更改为:

let SumVal1 = g.DividingSum(x => x.A.Value1, x => func(x.A, x.B))

Thnx,非常简单-但是我对给定的实现有一个问题。我的g值是IEnumerable(或IGrouping?),我的func不能接受匿名类型arguments@Archeg:我编辑了答案,在底部添加了一个额外的示例。哇,thnx。对我来说,非常酷的东西,当VS在last lambda=)中显示成员x.A,x.B的列表时,我非常惊讶。Thnx可以将“DividingSum”重命名为“WeightedAverage”,第一个选择器重命名为x,第二个选择器重命名为w@erash:可能。我会让阿赫格决定:)
let SumVal1 = g.DividingSum(x => x.A.Value1, func)
let SumVal1 = g.DividingSum(x => x.A.Value1, x => func(x.A, x.B))