2009-12-09 11 views
1

從數據中,我必須找到按日期總計和GrandTotal相應的行應該是 填寫(***)不適用時)。C#-Datewise total和GrandTotal使用LINQ

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

你如何在SQL中建模? – 2009-12-09 12:36:21

回答

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

的數據,該組也顯示在列表上

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) }; 

不知道要如何讓它進入你上面要求的格式總計?