WhoAmI
WhoAmI

Reputation: 1236

Adding more parameters to a Linq query

I'm using this query to count number of orders by date. I'm trying to add one more parameter that counts total products for each order, however I can't get it to work atm.

This is the essential part of a method that is suposed to return a list of 3 parameters (Date, TotalOrders and TotalProducts). Im using a Linq query to get a list with total order for each date, im wondering how to add my third parameter to the list "TotalProducts" and if i can do by adding one more search parameter in the Query. The foreach part below do not work propertly, it will return a list of TotalProducts but CreationDate will be the same for ech item in the list. I also have a feeling putting a foreach inside a foreach dosn't seem optimal for this:

 var orders = _orderService.SearchOrderStatistics(startDateValue, endDateValue, orderStatus,
                paymentStatus, shippingStatus, model.CustomerEmail, model.OrderGuid);


            var result = orders.Where(o => o.PaymentStatus == PaymentStatus.Paid)
                    .GroupBy(g => g.CreatedOnUtc.Date.ToString("yyyyMMdd"))
                    .Select(s => new { Date = s.Key, Count = s.Count() });



            List<GCOrdersModel> TotalOrdersPaid = new List<GCOrdersModel>();


               foreach (var g in result)
                    {

                        foreach (var opv in orders)
                        {
                            GCOrdersModel _Om = new GCOrdersModel(g.Date, g.Count.ToString(), opv.OrderProductVariants.Count.ToString());

                            TotalOrdersPaid.Add(_Om);

                        }

                    }

            return TotalOrdersPaid;

To access total products for every orders I must use OrderProductVariants.Count.ToString()

Can I add this parameter to the query?

Thx

Upvotes: 1

Views: 599

Answers (2)

Loetn
Loetn

Reputation: 4030

You could try this:

return orders.Where(o => o.PaymentStatus == PaymentStatus.Paid)
             .GroupBy(g => g.CreatedOnUtc.Date.ToString("yyyyMMdd"))
             .Select(s => new GCOrdersModel() 
                          { 
                              Date = s.Key, 
                              Count = s.Count(),
                              OpvCount = opv.OrderProductVariants.Count.ToString()
                          })
             .ToList();

or

return orders.Where(o => o.PaymentStatus == PaymentStatus.Paid)
             .GroupBy(g => g.CreatedOnUtc.Date.ToString("yyyyMMdd"))
             .Select(s => new GCOrdersModel(s.Key, s.Count, opv.OrderProductVariants.Count.ToString()))
             .ToList();

That way, you don't have to iterate over your result again. And it automatically creates your list of GCOrdersModel.

Edit

Does this work?

return orders.Where(o => o.PaymentStatus == PaymentStatus.Paid)
                 .GroupBy(g => g.CreatedOnUtc.Date.ToString("yyyyMMdd"))
                 .Select(s => new GCOrdersModel() 
                              { 
                                  Date = s.Key, 
                                  Count = s.Count(),
                                  OpvCount = s.OrderProductVariants.Count.ToString()
                              })
                 .ToList();

or

return orders.Where(o => o.PaymentStatus == PaymentStatus.Paid)
                 .GroupBy(g => g.CreatedOnUtc.Date.ToString("yyyyMMdd"))
                 .Select(s => new GCOrdersModel(s.Key, s.Count(), s.OrderProductVariants.Count.ToString()))
                 .ToList();

Upvotes: 1

Yuval Itzchakov
Yuval Itzchakov

Reputation: 149538

How about:

var opvCount =
    opv
        .OrderProductVariants
        .Count
        .ToString();

return
    orders
        .Where(o => o.PaymentStatus == PaymentStatus.Paid)
        .GroupBy(g => g.CreatedOnUtc.Date.ToString("yyyyMMdd"))
        .Select(s => new
        {
            Date = s.Key,
            Count = s.Count()
        })
        .Select(x =>
            new GCOrdersModelg(x.Date, g.Count.ToString(), opvCount));

Upvotes: 0

Related Questions