2014-09-25 113 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

试图在一个查询中执行此操作非常困难!我建议你创建两个不同的集合,一个用于你的集合,另一个用日期分组,不管颜色如何。

接下来我会按日期加入两套。

如果有必要,我会举一个例子。