2014-02-06 1 views
2

У меня есть метод, который получает некоторые данные из базы данных по некоторым запросам linq. Данные показаны как ожидаемые, но не в том порядке, в котором я не был. Мне нужно отсортировать продукты, которые я получаю из базы данных, по свойству TotalQuantity, показанному в запросе 1 и 2. Я пытаюсь использовать OrdeBy, но я не уверен, как добавить его в этом контексте. Нужна помощь с этим.Запрос Linq, как orderby

Это мой метод:

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; 
} 
+1

Вы получаете какие-то ошибки или вы получаете неправильные результаты? – Yakimych

+0

Я получаю неправильный результат. Кажется, он возвращает продукты «EntityId», а не TotalQuantity. Вы можете видеть переменные в «query2» – koffe14

ответ

1

насчет возвращения

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

Update: я могу думать только снова добавлять .ToList() до конца.

+0

Это не сработало. Tried: "return result.OrderBy (opv => opv.TotalQuantity);" но я получил эту ошибку: "Ошибка Невозможно неявно преобразовать тип 'System.Linq.IOrderedEnumerable ' to 'System.Collections.Generic.IList . Явное преобразование существует (вам не хватает роли?) " – koffe14

1

Удалите первый ToList() после Query2, как указано ниже:

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