Вы не можете выполнить сортировку следующим образом:
var pressRelease = from pr in db.PressReleases
orderby ddlPressSortBy.SelectedValue
where pr.Published == true
select pr;
, потому что результирующий запрос будет выглядеть примерно так (предположим, что вы выбрали первый элемент):
SELECT * FROM PressReleases
WHERE Published = 1
ORDER BY 'pr.DatePublished descending'
ORDER BY
предложение будет на фиксированное значение, что приводит к сортировке по умолчанию.
Linq OrderBy принимает Expression<Func<T, object>>
, что было бы что-то вроде pr => pr.DatePublishing
, если вы используете синтаксис Fluent. Синтаксис запроса просто скрывает это в красивой форме, но он работает так.
В соответствии с этой статьей , вы можете создать метод расширения для IQueryable, который позволит вам сортировать, используя имена свойств:
public static class extensionmethods
{
public static IQueryable<T> OrderByField<T>(this IQueryable<T> q, string SortField, bool Ascending)
{
var param = Expression.Parameter(typeof(T), "p");
var prop = Expression.Property(param, SortField);
var exp = Expression.Lambda(prop, param);
string method = Ascending ? "OrderBy" : "OrderByDescending";
Type[] types = new Type[] { q.ElementType, exp.Body.Type };
var mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);
return q.Provider.CreateQuery<T>(mce);
}
}
и затем используйте его в своем коде так:
var sortingInfo = ddlPressSortBy.SelectedValue.Split(' ');
var sortingProperty = sortingInfo[0];
var descending = sortingInfo[1] == "descending";
var pressRelease = from pr in db.PressReleases
where pr.Published == true
select pr;
pressRelease = pressRelease.OrderByField(sortingProperty, descending);
// rest of code