LINQ множественный заказ по

Я создал функцию со следующим параметром:

List<Expression<Func<CatalogProduct, bool>>> orderBy = null

Этот параметр является необязательным. Если он заполнен, он должен создать заказ по порядку для меня, чтобы я мог заказать результат на сервере SQL.

Я пытался:

            IOrderedQueryable temp = null;
            foreach (Expression<Func<CatalogProduct, bool>> func in orderBy)
            {
                if (temp == null)
                {
                    temp = catalogProducts.OrderBy(func);
                }
                else
                {
                    temp = temp.ThanBy(func);
                }
            }

Но чем К не осознается. Кто-нибудь знает, как я могу решить эту проблему?


Я изменил его на .ThenBy(), но это разрешено только непосредственно после .OrderBy(), а не в IOrderedQueryable.

поэтому temp = catalogProducts.OrderBy(func).ThenBy(func); разрешено, но temp = catalogProducts.OrderBy(func); temp = temp.ThenBy(func); не

Любые другие предложения?


person Wouter    schedule 21.06.2010    source источник
comment
Это ошибка использования английского языка, а не ошибка программирования!   -  person Carlos    schedule 21.06.2010
comment
Смотрите обновленный ответ относительно вашего обновления.   -  person Marc Gravell    schedule 21.06.2010
comment
Комментарий от Джона, повторно опубликованный из вашего удаленного ответа: ThenBy разрешен для IOrderedQueryable; это не разрешено для простого IQueryable. Вы уверены, что правильно объявили temp?   -  person Marc Gravell    schedule 21.06.2010


Ответы (3)


Две проблемы; во-первых, ThanBy должно быть ThenBy; во-вторых, ThenBy доступен только для универсального типа IOrderedQueryable<T>.

Итак, измените на:

        IOrderedQueryable<CatalogProduct> temp = null;
        foreach (Expression<Func<CatalogProduct, bool>> func in orderBy) {
            if (temp == null) {
                temp = catalogProducts.OrderBy(func);
            } else {
                temp = temp.ThenBy(func);
            }
        }

и вы должны быть отсортированы.

person Marc Gravell    schedule 21.06.2010

попробуй это

   IOrderedQueryable temp = null; 
   foreach (Expression<Func<CatalogProduct, bool>> func in orderBy) 
    { 
      if (temp == null) 
        { 
          temp = catalogProducts.OrderBy(func);
        } 
        else
        { 
          temp = temp.OrderBy(func); 
        } 
     }
person smash    schedule 21.06.2010
comment
Это будет каждый раз переупорядочивать с нуля. Для множественных заказов вам действительно следует использовать ThenBy. - person Jon Skeet; 21.06.2010
comment
Вызов второго OrderBy будет, в зависимости от реализации, либо выполнять сортировку в обратном порядке, или сортировать только по последнему. - person Marc Gravell; 21.06.2010
comment
@Jon - не совсем обязательно; помните, что сортировка LINQ должна быть стабильной, поэтому последовательность сортировки просто меняется на обратную. - person Marc Gravell; 21.06.2010
comment
@Марк: Верно. Хотя в принципе это не правильный путь :) - person Jon Skeet; 21.06.2010

        foreach (Expression<Func<CatalogProduct, bool>> func in orderBy)
        {
            catalogProducts = catalogProducts.OrderBy(func);
        }

Это будет нормально.

person Kyaw Thurein    schedule 21.06.2010