Linq To SQL: сортировка запроса по произвольному свойству (столбцу)
У меня большая/более сложная задача, но для простоты рассмотрим следующее:
Скажем, что у меня есть таблица в SQL DataBase, называемая Product, имеющая два столбца: ID (int, первичный ключ) и Имя (varchar/string). У меня также есть простой LINQ DataContext.
У меня есть запрос, построенный и переданный "моей" функции. Скажем, это что-то вроде: (хотя это может быть немного сложнее)
IQueryable<Product> query = from p in db.Products select p;
Как только мой метод получит этот запрос, переданный в качестве параметра, он должен изменить порядок сортировки, например.
IQueryable<Product> sortedQuery = query.OrderBy(x => x.Name);
Я хотел бы сделать это более общим, т.е. указать поле для сортировки. Обычно я могу сделать оператор switch
, который принимает строку. Однако я хотел бы знать, есть ли способ передать параметр напрямую. Я намерен распространить это на другие таблицы базы данных, поэтому эти операторы switch
будут утомительными.
Я пытался что-то вроде:
IQueryable<Product> sortedQuery = query.OrderBy(x => (typeof(Product)).GetProperty("Name"));
Но это не работает. Я также хочу обеспечить поддержку LINQ to SQL, то есть сортировку, которая будет выполняться на SQL Server. Следовательно, если я отлаживаю, я должен получить SQL-запрос из этого запроса LINQ.
Заранее благодарим вас за помощь.
Ответы
Ответ 1
Вы можете использовать Dynamic Linq
для этой цели.
См. здесь Динамический LINQ (часть 1: Использование библиотеки динамических запросов LINQ)
Затем вы можете делать такие вызовы:
var query = DBContext.Users.Where( "Age > 3" ).OrderBy( "Name asc" );
Ответ 2
Попробуйте это вместо:
query.OrderBy(x => x.GetType().GetProperty("Name").GetValue(x, null));
Вы не можете просто захватить свойство. Вам нужно захватить значение этого свойства, следовательно, вызов GetValue
.
Ответ 3
Это не так просто, как кажется. Механизм LINQ to SQL анализирует выражение, которое вы передаете методу OrderBy
, чтобы получить имя свойства, на которое вы ссылаетесь, затем использует эту информацию для составления простого предложения SQL order by
.
Я предполагаю, что, возможно, это может быть сделано с использованием отражения. Возможно, вы можете получить что-то полезное из принятого ответа этого SO-вопроса.