C#-Datewise total和Grand Total使用LINQ

时间:2009-12-09 12:33:48

标签: c# linq

从Data,我必须找到datewise total和GrandTotal相应的行 在不适用时填写(***)

OrderID     OrderAmt   OrderDate                                              
----------- ---------- --------------------
1           10.50      2003-10-11 08:00:00
2           11.50      2003-10-11 10:00:00
3           1.25       2003-10-11 12:00:00
4           100.57     2003-10-12 09:00:00
5           19.99      2003-10-12 11:00:00
6           47.14      2003-10-13 10:00:00
7           10.08      2003-10-13 12:00:00
8           7.50       2003-10-13 19:00:00
9           9.50       2003-10-13 21:00:00

输出

OrderID     Order Date OrderAmt   Sub Total  Grand Total 
----------- ---------- ---------- ---------- ----------- 
1           10/11/2003 10.50       ***         ***            
2           10/11/2003 11.50       ***         ***           
3           10/11/2003 1.25       23.25        ***        
4           10/12/2003 100.57      ***         ***            
5           10/12/2003 19.99      120.56       ***        
6           10/13/2003 47.14      ***          ***           
7           10/13/2003 10.08      ***          ***           
8           10/13/2003 7.50       ***          ***           
9           10/13/2003 9.50       74.22      218.03

以下查询需要进行哪些更改?

var qry =
                (from o in ord

                 select new
                 {

                     OrdNumber = o.OrderNumber,
                     OrdDate = o.OrderDate,
                     Amount = o.OrderAmount,
                     GrandTotal = ord.Sum(p => p.OrderAmount)
                 }
                  ).ToList();

2 个答案:

答案 0 :(得分:2)

除了难以理解,而且效率极低之外,这应该可以解决问题:

var SubTotals = from o in ord
                group o by o.OrderDate.Date into g
                    select new
                               {
                                   Id = g.Max(x => x.OrderNumber),
                                   Amount = g.Sum(x => x.OrderAmount)
                               };
var qry = from o in ord
          orderby o.OrderDate
          let subTotals = SubTotals.Where(x => x.Id == o.OrderNumber)
          let grandTotal = ord.Sum(x => x.OrderAmount)
          let lastId = ord.OrderBy(x => x.OrderNumber).Last().OrderNumber
          select
              new
                  {
                      OrderNumber = o.OrderNumber,
                      OrderDate = o.OrderDate.Date,
                      Amount = o.OrderAmount,
                      SubTotal = (subTotals.Any()
                                    ? subTotals.First().Amount.ToString()
                                    : "***"),
                      GrandTotal = (o.OrderNumber == lastId
                                    ? grandTotal.ToString()
                                    : "***")
                  };

作为一般免责声明,我建议您重新考虑使用linq格式化数据。如果你只使用SQL,那么黑客攻击这种代码是很好的,但是如果有机会,只需循环数据集就不会感到羞耻: - )

答案 1 :(得分:1)

这将按数据分组,并显示列表中的总计

public class MyClass
{
    public int OrderID;
    public decimal OrderAmount;
    public DateTime OrderDate;
}

List<MyClass> list = new List<MyClass>();
list.Add(new MyClass { OrderID = 1, OrderAmount = 10.50m, OrderDate = new DateTime(2009, 10, 11, 8, 0, 0) });
list.Add(new MyClass { OrderID = 1, OrderAmount = 11.50m, OrderDate = new DateTime(2009, 10, 11, 10, 0, 0) });
list.Add(new MyClass { OrderID = 1, OrderAmount = 1.25m, OrderDate = new DateTime(2009, 10, 11, 12, 0, 0) });

list.Add(new MyClass { OrderID = 1, OrderAmount = 100.57m, OrderDate = new DateTime(2009, 10, 12, 09, 0, 0) });
list.Add(new MyClass { OrderID = 1, OrderAmount = 19.99m, OrderDate = new DateTime(2009, 10, 12, 11, 0, 0) });

var t = from l in list
    group l by l.OrderDate.Date into g
    let sum = g.Sum(x => x.OrderAmount)
    select new { g.Key, sum , GrandTotal = list.Sum(x => x.OrderAmount) };

不确定您希望如何将其转换为上述要求的格式?