LINQ Query with both CASE statement and SUM function

前端 未结 2 1514
孤街浪徒
孤街浪徒 2021-01-21 06:28

I\'m struggling to find an example of how to return a conditional sum using a LINQ query or LAMBDA. I\'ve written both independently but combining the CASE with SUM is vexing.

相关标签:
2条回答
  • 2021-01-21 07:21

    Here is an example using the Northwinds database. This will get you the results that you are expecting but the SQL won't match your example.

    using (var context = new NorthwindEntities())
    {
        DateTime volumn1Date = DateTime.Today.AddDays(-1);
        DateTime volumn7Date = DateTime.Today.AddDays(-7);
        DateTime volumn30Date = DateTime.Today.AddDays(-30);
    
        var query = from o in context.Order_Details
                    group o by o.Product.ProductName into g
                    select new
                    {
                        ProductName = g.Key,
                        Volume1Day = g.Where(d => d.Order.OrderDate.Value <= volumn1Date)
                                      // cast to Int32? because if no records are found the result will be a null                                              
                                      .Sum(d => (Int32?) d.Quantity),
                        Volume7Day = g.Where(d => d.Order.OrderDate.Value <= volumn7Date)
                                      .Sum(d => (Int32?) d.Quantity),
                        Volume30Day = g.Where(d => d.Order.OrderDate.Value <= volumn30Date)
                                       .Sum(d => (Int32?) d.Quantity)
                    };
    
    
        var list = query.ToList();
    }
    
    0 讨论(0)
  • 2021-01-21 07:22

    answer does not wrong but does not generate optimize query. better answer is:

    using (var context = new NorthwindEntities())
    {
        DateTime volumn1Date = DateTime.Today.AddDays(-1);
        DateTime volumn7Date = DateTime.Today.AddDays(-7);
        DateTime volumn30Date = DateTime.Today.AddDays(-30);
    
    var query = from o in context.Order_Details
                    group o by o.Product.ProductName into g
                    select new
                    {
                        ProductName = g.Key,
                        Volume1Day = g.Sum(d => d.Order.OrderDate.Value <= volumn1Date ? (Int32?) d.Quantity : 0),
                        Volume7Day = g.Sum(d => d.Order.OrderDate.Value <= volumn7Date ? (Int32?) d.Quantity : 0),
                        Volume30Day = g.Sum(d => d.Order.OrderDate.Value <= volumn30Date ? (Int32?) d.Quantity : 0)
                    };
    
        var list = query.ToList();
    }
    
    0 讨论(0)
提交回复
热议问题