2009-12-09 5 views
1

À partir des données, je dois trouver le total par date et GrandTotal la ligne appropriée doit être remplie de (***) si non applicable).C# -Datewise total et GrandTotal utilisant 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 

Sortie

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 

Quels sont les changements nécessaires dans la requête suivante?

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

Comment modéliser cela en SQL? –

Répondre

2

En plus d'être illisible, et follement inefficace, cela devrait faire l'affaire:

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() 
            : "***") 
        }; 

Comme un avertissement général, je vous invite à revenir sur LINQ pour le formatage des données. Hacker ce type de code est bien si vous êtes lié à l'utilisation de SQL, mais étant donné la chance, il n'y a pas de honte à simplement boucler sur un jeu de données :-)

1

Ce groupe de volonté par des données et montrent aussi le grand total sur la liste

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

Je ne sais pas comment vous voulez l'obtenir dans le format de votre choix ci-dessus?