2010-08-19 83 views
3

在我的新项目中,我正在写很多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(我把数据库逻辑移动到客户端)组成的。请给我一些提示,也许不平凡=)

而且我要避免使用非匿名类型

回答

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到对象...的LINQ to SQL(或实体)会让这更难,但可能并非不可能。

编辑:回应评论,你只需要改变调用:

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

日Thnx,很简单 - 但我有一个给定的实现问题。 我的g值是IEnumerable <匿名类型>(或IGrouping <匿名类型>?),我的func不能接受匿名类型作为参数 – Archeg 2010-08-19 12:44:46

+0

@Archeg:我编辑了答案,在底部添加了一个额外的例子。 – 2010-08-19 12:48:36

+0

哇,thnx。至于我 - 非常酷的东西,当VS显示成员xA,xB在最后一个lambda =) thnx很多 – Archeg 2010-08-19 12:55:18