Question

I have a method that gets some data from the database by some linq queries. The data is shown as expected but not in the order I wan't. I need to sort the products I get from the database by the TotalQuantity property shown in query 1 and 2. Im trying to use OrdeBy but I'm not sure how to add it in this context. Need some help with this one.

This is my method:

public IList<BestsellersReportLine> DailyBestsellersReport()
{
    OrderStatus os; 
    PaymentStatus ps; 
    ShippingStatus ss;
    int billingCountryId = 0;
    int recordsToReturn = 10; 
    int orderBy = 1;
    int groupBy = 1;

    var range = new
    {
        startTimeUtc = DateTime.Today.AddDays(-1),
        endTimeUtc = DateTime.Today.AddSeconds(-1),
        CreatedOnUtc = DateTime.Today.AddDays(-1),
    };

   var query1 = from opv in _opvRepository.Table
               join o in _orderRepository.Table on opv.OrderId equals o.Id
               join pv in _productVariantRepository.Table on opv.ProductVariantId equals pv.Id
               join p in _productRepository.Table on pv.ProductId equals p.Id
               where (o.CreatedOnUtc >= range.startTimeUtc && o.CreatedOnUtc <= range.endTimeUtc)
               select opv;

   var query2 = groupBy == 1 ?
               //group by product variants
               from opv in query1
               group opv by opv.ProductVariantId into g
               select new
               {
                   EntityId = g.Key,
                   TotalAmount = g.Sum(x => x.PriceExclTax),
                   TotalQuantity = g.Sum(x => x.Quantity),
               }
               :
               //group by products
               from opv in query1
               group opv by opv.ProductVariant.ProductId into g
               select new
               {
                   EntityId = g.Key,
                   TotalAmount = g.Sum(x => x.PriceExclTax),
                   TotalQuantity = g.Sum(x => x.Quantity),
               };

   switch (orderBy)
   {
      case 1:
            {
                 query2 = query2.OrderByDescending(x => x.TotalQuantity);
            }
            break;
     case 2:
           {
                 query2 = query2.OrderByDescending(x => x.TotalAmount);
           }
           break;
     default:
           throw new ArgumentException("Wrong orderBy parameter", "orderBy");
    }

    if (recordsToReturn != 0 && recordsToReturn != int.MaxValue)
         query2 = query2.Take(recordsToReturn);

    var result = query2.ToList().Select(x =>
    {
        var reportLine = new BestsellersReportLine()
        {
             EntityId = x.EntityId,
             TotalAmount = x.TotalAmount,
             TotalQuantity = x.TotalQuantity
        };
        return reportLine;
    }).ToList();

    return result;
}
Was it helpful?

Solution

What about return

result.OrderBy(x => x.totalQuantity).ToList();

Update: I can only think of adding .ToList() to the end again.

OTHER TIPS

Remove the first ToList() after query2 as mentioned below:

var result = query2.Select(x =>
{
    var reportLine = new BestsellersReportLine()
    {
         EntityId = x.EntityId,
         TotalAmount = x.TotalAmount,
         TotalQuantity = x.TotalQuantity
    };
    return reportLine;
}).ToList();
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top