2014-09-25 169 views
0

我遇到了我的Linq查詢的問題。基本上,我從LinqPad獲得了下面的內容,它們按日期和文本字段(類型)進行分組,並給出結果。問題在於,我需要爲每個日期確定總價值,以及與總價值相比時「藍色」的百分比。Linq Group得到總體的百分比

var t = (from p in Orders where (p.Type == "Blue" || p.Metric == "Red" || p.Metric == "White") 
&& p.OrderDate>= new DateTime(2014,8,26,0,0,0) 
orderby p.OrderDate, p.Type 
group p by new { p.OrderDate, p.Type} into gd 
select new {OrderDate = gd.Key.OrderDate, Type= gd.Key.Type, Value = gd.Sum(x => x.Value)}).ToList().Dump(); 

所以,如果我有3行像下面的那些,我需要得到一個行回來:

  1. 2014年8月28日, 「藍」,30
  2. 2014-08- 28日, 「紅」,25
  3. 2014年8月28日, 「白」,95

結果我後:

  1. 2014年8月28日, 「藍」,0.2

的 「0.2」 是用於一個日期的 「藍色」 的條目的百分比。當然,如果有多個日期,我需要每日約1行:-)

這是在做我的頭,所以任何指針,將不勝感激。像往常一樣,我在谷歌和搜索首先,但經過幾次嘗試決定問。

謝謝!

回答

0

很肯定你必須做一個Join得到你想要的東西,因爲我們在技術上處理兩組數據,僅由OrderDate分組的數據集,並通過OrderDate,並Type分組的數據集。

請注意,這根本沒有整潔......所以謹慎使用,我還希望對這樣的代碼進行詳細的評論,因爲它完全不可讀。

var orderPercent = orders 
    .GroupBy(x => x.OrderDate) 
    .Join(
     orders.GroupBy(y => new { y.OrderDate, y.Type }), 
     x => x.Key, 
     y => y.Key.OrderDate, 
     (a, b) => new { Date = a.Key, Type = b.Key.Type, Percent = (double)b.Sum(x => x.Value)/(double)a.Sum(x => x.Value) } 
    ).ToList(); 
+0

謝謝,你當然很難保持沒有評論。 – Dominik 2014-09-26 03:16:49

+0

@Dominik是的,它是LINQ醜陋,但仍然可能比使用循環更可怕的奇怪情況之一。 – Xenolightning 2014-09-28 08:01:52

0

試圖在一個查詢中執行此操作非常困難!我建議你創建兩個不同的集合,一個用於你的集合,另一個用日期分組,不管顏色如何。

接下來我會按日期加入兩套。

如果有必要,我會舉一個例子。