Подтвердить что ты не робот

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.

Заранее благодарим вас за помощь.

4b9b3361

Ответ 2

Попробуйте это вместо:

query.OrderBy(x => x.GetType().GetProperty("Name").GetValue(x, null));

Вы не можете просто захватить свойство. Вам нужно захватить значение этого свойства, следовательно, вызов GetValue.

Ответ 3

Это не так просто, как кажется. Механизм LINQ to SQL анализирует выражение, которое вы передаете методу OrderBy, чтобы получить имя свойства, на которое вы ссылаетесь, затем использует эту информацию для составления простого предложения SQL order by.

Я предполагаю, что, возможно, это может быть сделано с использованием отражения. Возможно, вы можете получить что-то полезное из принятого ответа этого SO-вопроса.