Я нашел пример в VS2008 Примеры для динамического LINQ, который позволяет использовать sql-подобную строку (например, OrderBy("Name, Age DESC"))
для упорядочивания. К сожалению, включенный метод работает только на IQueryable<T>
. Есть ли способ включить эту функцию IEnumerable<T>
?
c#
linq
linq-to-objects
Джон Шиэн
источник
источник
Ответы:
Просто наткнулся на этого старичка ...
Чтобы сделать это без динамической библиотеки LINQ, вам просто нужен код, как показано ниже. Это охватывает наиболее распространенные сценарии, включая вложенные свойства.
Чтобы заставить его работать с
IEnumerable<T>
вами, вы можете добавить некоторые методы-обертки, которые проходят черезAsQueryable
- но приведенный ниже код является основнойExpression
логикой.Редактировать: это становится более забавным, если вы хотите смешать это с
dynamic
- хотя обратите внимание, что этоdynamic
применимо только к LINQ-to-Objects (деревья выражений для ORM и т. Д. Не могут действительно представлятьdynamic
запросы -MemberExpression
не поддерживает это). Но вот способ сделать это с LINQ-to-Objects. Обратите внимание, что выбор из-Hashtable
за благоприятной семантики блокировки:источник
IQueryable<T>
, так что если у вас есть что - то подобноеList<T>
(чтоIEnumerable<T>
) вам может понадобиться использованиеAsQueryable()
- напримерvar sorted = someList.AsQueryable().OrderBy("Foo.Bar");
Слишком легко без каких-либо осложнений:
using System.Linq.Dynamic;
вверху.vehicles = vehicles.AsQueryable().OrderBy("Make ASC, Year DESC").ToList();
источник
System.Linq.Dynamic
?Я нашел ответ. Я могу использовать
.AsQueryable<>()
метод расширения, чтобы преобразовать мой список в IQueryable, а затем запустить динамический порядок для него.источник
Просто наткнулся на этот вопрос.
Используя вышеописанную реализацию ApplyOrder от Marc, я собрал метод Extension, который обрабатывает подобные SQL строки:
Подробности можно найти здесь: http://aonnull.blogspot.com/2010/08/dynamic-sql-like-linq-orderby-extension.html
источник
Я полагаю, будет полезно использовать отражение, чтобы получить любое свойство, по которому вы хотите отсортировать:
Обратите внимание, что использование отражения значительно медленнее, чем прямой доступ к свойству, поэтому необходимо изучить производительность.
источник
Просто опираясь на то, что сказали другие. Я обнаружил, что следующее работает довольно хорошо.
источник
Я наткнулся на этот вопрос, ища несколько предложений Linq для нескольких заказов, и, возможно, это было то, что искал автор
Вот как это сделать:
источник
Я пытался сделать это, но у меня возникли проблемы с решением Kjetil Watnedal, потому что я не использую встроенный синтаксис linq - я предпочитаю синтаксис в стиле метода. Моя конкретная проблема заключалась в попытке выполнить динамическую сортировку с использованием пользовательских
IComparer
.Мое решение закончилось так:
Для данного запроса IQueryable, например, так:
И учитывая аргумент поля сортировки во время выполнения:
Динамический OrderBy выглядит так:
И это использует маленький вспомогательный метод с именем GetReflectedPropertyValue ():
И последнее - я упомянул, что хочу
OrderBy
использовать пользовательские настройкиIComparer
- потому что я хотел сделать естественную сортировку .Для этого я просто изменяю на
OrderBy
:Смотрите этот пост для кода для
NaturalSortComparer()
.источник
Используйте динамический
linq
просто добавь
using System.Linq.Dynamic;
И используйте это так, чтобы упорядочить все ваши столбцы:
источник
Вы можете добавить это:
GetPropertyValue
Функция от ответа Кьетил Watnedal вВопрос был бы почему? Любая такая сортировка будет генерировать исключения во время выполнения, а не во время компиляции (как ответ D2VIANT).
Если вы имеете дело с Linq to Sql, а orderby - это дерево выражений, оно все равно будет преобразовано в SQL для выполнения.
источник
OrderBy
не поддерживать предыдущий порядок!Вот еще кое-что, что я нашел интересным. Если ваш источник - DataTable, вы можете использовать динамическую сортировку без использования Dynamic Linq.
ссылка: http://msdn.microsoft.com/en-us/library/bb669083.aspx (Использование DataSetExtensions)
Вот еще один способ сделать это, преобразовав его в DataView:
источник
Благодаря Maarten ( Запрос коллекции с использованием объекта PropertyInfo в LINQ ) я получил это решение:
В моем случае я работал над «ColumnHeaderMouseClick» (WindowsForm), поэтому просто нашел конкретный нажатой столбец и его соответствующий PropertyInfo:
ИЛИ
(убедитесь, что имена столбцов совпадают со свойствами объекта)
ура
источник
После долгих поисков это сработало для меня:
источник
Вы можете конвертировать IEnumerable в IQueryable.
источник
Альтернативное решение использует следующий класс / интерфейс. Это не совсем динамично, но работает.
источник
Этот ответ является ответом на комментарии, которым нужен пример решения, предоставленного @John Sheehan - Runscope
в DAL (уровень доступа к данным),
IEnumerable версия:
IQueryable версия
Теперь вы можете использовать версию IQueryable для привязки, например, GridView в Asp.net и использовать преимущества для сортировки (вы не можете сортировать, используя версию IEnumerable)
Я использовал Dapper в качестве ORM и собрал версию IQueryable и использовал сортировку в GridView в asp.net так легко.
источник
Сначала установите Dynamic Tools -> Диспетчер пакетов NuGet -> Консоль диспетчера пакетов
Добавить пространство имен
using System.Linq.Dynamic;
Теперь вы можете использовать
OrderBy("Name, Age DESC")
источник
Вы можете использовать это:
источник
Преобразуйте List в IEnumerable или Iquerable, добавьте с помощью пространства имен System.LINQ.Dynamic, после чего вы можете упомянуть имена свойств в строке, разделенной запятой, в метод OrderBy, который по умолчанию поставляется из System.LINQ.Dynamic.
источник
источник