Linq к объектам Динамическая сортировка

Это - мой запрос, как я могу использовать строку в качестве orderby параметр?

string sortColumn="Title";

var  items = (from ltem in ctxModel.Items
              where ltem.ItemID == vId
              orderby //something here
              select ltem).Skip(PageSize * PageIndex).Take(PageSize);

ОБНОВЛЕНИЕ:
Я не могу просто OrderBy набор результатов, потому что я СНАЧАЛА должен отсортировать, и только ЗАТЕМ к странице.

18
задан verror 30 April 2010 в 21:26
поделиться

4 ответа

Другие предлагали использовать Dynamic link или другие библиотеки. Лично я бы не стал вводить зависимость от библиотеки для такой маленькой задачи. Но есть два других пути, по которым вы можете пойти...

  • Использовать синтаксис Вызов объекта и построить дерево выражений запроса динамически. Например...

См. http://blog.cincura.net/229310-sorting-in-iqueryable-using-string-as-column-name/

В этом сценарии важно учитывать Отложенное выполнение. Вы можете безопасно построить запрос, который возвращает объект IQueryable, а затем запустить объектный запрос sort на этом объекте. Ваш запрос будет выполняться только один раз, когда к данным будет осуществляться фактический доступ.

Приведенное выше сообщение блога является примером того, как можно использовать Expression API для построения дерева выражений, которое можно использовать для OrderBy. Это действительно звучит сложно. Статья в MSDN может быть лучшей ссылкой. Смотрите Как: Use Expression Trees to Build Dynamic Queries на MSDN.

Или

  • Используйте простой путь и просто используйте переключатель в заголовке для всего запроса.

Например,

ItemType items = default(ItemType);
switch(sortColumn)
{
     case "Title":
     {
           items = ctxModel.Items
                    .Where(i => i.ItemID == vId)
                    .OrderBy( i => i.Title);
     }
     break;
 }
6
ответ дан 30 November 2019 в 07:49
поделиться

Вот еще одна альтернатива, EntitySorter . Немного разрешает то, что динамический LINQ делает со строками, но оборачивает операцию в объект, как и в случае с шаблоном объекта запроса . Он позволяет сортировать как по строкам, так и по типобезопасным конструкциям. Вот несколько примеров:

// Ways of defining an entity sorter
// 1. Using strings:
IEntitySorter<Person> sorter = EntitySorter<Person>
    .OrderBy("Address.City")
    .ThenByDescending("Id");

// 2. Defining a sorter with lambda's
IEntitySorter<Person> sorter = EntitySorter<Person>
    .OrderByDescending(p => p.Name)
    .ThenBy(p => p.Id)
    .ThenByDescending(p => p.Address.City);

// 3. Using a LINQ query
IEntitySorter<Person> sorter =
    from person in EntitySorter<Person>.AsQueryable()
    orderby person.Name descending, person.Address.City
    select person;

// And you can pass a sorter from your presentation layer
// to your business layer, and you business layer may look
// like this:
static Person[] GetAllPersons(IEntitySorter<Person> sorter)
{
    using (var db = ContextFactory.CreateContext())
    {
        IOrderedQueryable<Person> sortedList =
            sorter.Sort(db.Persons);

        return sortedList.ToArray();
    }
}

Вы можете найти код здесь .

8
ответ дан 30 November 2019 в 07:49
поделиться

Этот запрос выглядит так, как будто вы используете настраиваемую привязку данных и / или ObjectDataSource, независимо от того, есть ли способ сделать это с помощью метода расширения, который требует сортировки выражение и динамически добавляет вызов (выражение) OrderBy () к запросу linq. Я задокументировал это в сообщении блога некоторое время назад, которое по совпадению было частью этого вопроса SO . Если вам нужно больше, вы можете использовать dynamic linq , который довольно хорошо документирован scottgu.

РЕДАКТИРОВАТЬ: использование метода расширения сделает его похожим на

string sortColumn="Title";

    var  items = (from ltem in ctxModel.Items
                  where ltem.ItemID == vId
                  select ltem).Skip(PageSize * PageIndex).Take(PageSize).OrderBy(sortColumn);
1
ответ дан 30 November 2019 в 07:49
поделиться

Очевидно, другие ссылки на Dynamic Linq недостаточно ясны. Позвольте мне пролить свет…

Использование Dynamic Linq не обязательно указывает на необходимость наличия зависимости от сборки.

Dynamic Linq содержится в одном исходном файле, если я не ошибаюсь, он включен в образцы C #, которые все должны были хотя бы просмотреть когда-нибудь за последние 3 года, и его можно легко перетащить в проект и разместить в пространстве имен в предотвращать коллизии, тем самым предоставляя услуги по построению выражений, которые можно использовать везде, где в этом возникает необходимость.

Я считаю, что возможность безопасно построить выражение из разумно произвольной строки , которое можно легко построить «на лету», является лучшим примером «динамического».

Примите во внимание:

    var query = northwind.Products
                         .Where("CategoryID = 3 AND UnitPrice > 3")
                         .OrderBy("SupplierID");
4
ответ дан 30 November 2019 в 07:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: