2010-08-19 86 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