简化和设计LINQ查询
问题描述:
在我的新项目中,我正在写很多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(我把数据库逻辑移动到客户端)组成的。请给我一些提示,也许不平凡=)
而且我要避免使用非匿名类型
答
像这样的东西(假设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到对象...的LINQ to SQL(或实体)会让这更难,但可能并非不可能。
编辑:回应评论,你只需要改变调用:
let SumVal1 = g.DividingSum(x => x.A.Value1, x => func(x.A, x.B))
日Thnx,很简单 - 但我有一个给定的实现问题。 我的g值是IEnumerable (或IGrouping ?),我的func不能接受匿名类型作为参数 – Archeg 2010-08-19 12:44:46
@Archeg:我编辑了答案,在底部添加了一个额外的例子。 – 2010-08-19 12:48:36
哇,thnx。至于我 - 非常酷的东西,当VS显示成员xA,xB在最后一个lambda =) thnx很多 – Archeg 2010-08-19 12:55:18