Это - мой запрос, как я могу использовать строку в качестве 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 набор результатов, потому что я СНАЧАЛА должен отсортировать, и только ЗАТЕМ к странице.
Другие предлагали использовать 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;
}
Вот еще одна альтернатива, 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();
}
}
Вы можете найти код здесь .
Этот запрос выглядит так, как будто вы используете настраиваемую привязку данных и / или 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);
Очевидно, другие ссылки на Dynamic Linq недостаточно ясны. Позвольте мне пролить свет…
Использование Dynamic Linq не обязательно указывает на необходимость наличия зависимости от сборки.
Dynamic Linq содержится в одном исходном файле, если я не ошибаюсь, он включен в образцы C #, которые все должны были хотя бы просмотреть когда-нибудь за последние 3 года, и его можно легко перетащить в проект и разместить в пространстве имен в предотвращать коллизии, тем самым предоставляя услуги по построению выражений, которые можно использовать везде, где в этом возникает необходимость.
Я считаю, что возможность безопасно построить выражение из разумно произвольной строки
, которое можно легко построить «на лету», является лучшим примером «динамического».
Примите во внимание:
var query = northwind.Products
.Where("CategoryID = 3 AND UnitPrice > 3")
.OrderBy("SupplierID");