C # Entity Framework Группировка продаж по часам - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть класс Order и OrderDetails со следующей структурой

public class Order 
{
   public int Id {get;set;}
   ........
}
public class OrderDetails
{
   public int Id {get;set;}
   public int TotalSales {get;set;}
   public DateTime OrderDate { get;set;}
   public int OrderId // navigation property to Order class
   ......
}

Мне нужно суммировать продажи и сгруппировать их по часам и количеству заказов, сделанных в этот час. Другими словами, мне нужнобыть таким

    {
       "date":"10-11-2018",
       "Hour":"9:00 AM",
       "totalSales":228.91,
       "OrdersCount":10
    },


    {
       "date":"10-11-2018",
       "Hour":"10:00 AM",
       "totalSales":150.8,
       "OrdersCount":5
    },

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 15 декабря 2018

Это, вероятно, можно оптимизировать, но это будет делать то, что вы просите

public class OrderCollectionDetails
{
    public DateTime ForDate { get; set; }
    public double TotalSales { get; set; }
    public int OrderCount { get; set; }
}

public class OrderDetails
{
    public DateTime OrderDate { get; set; }
    public double Sales { get; set; }
}

    static void Main(string[] args)
    {
        List<OrderDetails> orders = new List<OrderDetails>();
        orders.Add(new OrderDetails() { OrderDate  = DateTime.Parse("12/14/2018 3:00"), Sales = 10 });
        orders.Add(new OrderDetails() { OrderDate  = DateTime.Parse("12/14/2018 3:30"), Sales = 20.5 });
        orders.Add(new OrderDetails() { OrderDate  = DateTime.Parse("12/14/2018 3:40"), Sales = 55.23 });
        orders.Add(new OrderDetails() { OrderDate = DateTime.Parse("12/14/2018 4:00"), Sales = 1.11 });
        var orderGrp = orders.GroupBy(o => new DateTime(o.OrderDate.Year, o.OrderDate.Month, o.OrderDate.Day, o.OrderDate.Hour, 0, 0));
        List<OrderCollectionDetails> details = new List<OrderCollectionDetails>();
        foreach(var grp in orderGrp)
        {
            var firstItm = grp.FirstOrDefault();
            var targetDate = new DateTime(firstItm.OrderDate.Year, firstItm.OrderDate.Month, firstItm.OrderDate.Day, firstItm.OrderDate.Hour, 0, 0);
            details.Add(new OrderCollectionDetails()
            {
                ForDate = targetDate,
                OrderCount = grp.Count(),
                TotalSales = grp.Sum(g => g.Sales)
            });
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...