OMG! Dots!
Я был в одной лодке, но, слава Богу, я нашел блестящее решение, опубликованное нашим коллегой-разработчиком Джарретт Мейер . Я обнаружил это, возможно, через 3 часа, когда гуглил в прошлом, и только сейчас, когда решил увеличить нумерацию страниц и сортировку с помощью MvcContrib
Grid.
Вы можете найти полный пост здесь:
Сортировка на стороне сервера с динамическим LINQ
Его код спас меня ...: D Использование функции LINQ Aggregate было УДИВИТЕЛЬНЫМ! Kudozzz ему.
Мне пришлось немного изменить оригинальный код Джарретта, чтобы он соответствовал моим потребностям. Вот код после того, как я изменил его:
public static IQueryable<T> OrderBy<T>(this IQueryable<T> collection, GridSortOptions sortOptions)
{
if (string.IsNullOrEmpty(sortOptions.Column))
{
return collection;
}
Type collectionType = typeof(T);
ParameterExpression parameterExpression = Expression.Parameter(collectionType, "p");
Expression seedExpression = parameterExpression;
Expression aggregateExpression = sortOptions.Column.Split('.').Aggregate(seedExpression, Expression.Property);
MemberExpression memberExpression = aggregateExpression as MemberExpression;
if (memberExpression == null)
{
throw new NullReferenceException(string.Format("Unable to cast Member Expression for given path: {0}.", sortOptions.Column));
}
LambdaExpression orderByExp = Expression.Lambda(memberExpression, parameterExpression);
const string orderBy = "OrderBy";
const string orderByDesc = "OrderByDescending";
Type childPropertyType = ((PropertyInfo)(memberExpression.Member)).PropertyType;
string methodToInvoke = sortOptions.Direction == MvcContrib.Sorting.SortDirection.Ascending ? orderBy : orderByDesc;
var orderByCall = Expression.Call(typeof(Queryable), methodToInvoke, new[] { collectionType, childPropertyType }, collection.Expression, Expression.Quote(orderByExp));
return collection.Provider.CreateQuery<T>(orderByCall);
}
Теперь вы можете вызывать этот метод расширения следующим образом в вашем методе контроллера:
var users = Database.Memberships.OrderBy(sort);
где sort
- это GridSortOptions, который находится в MvcContrib.UI.Grid
.
sort.ColumnName
теперь может содержать строки, подобные этим:
User.UserName
User.MyRelatedEntity.RelatedEntityProperty
User.MyRelatedEntity.RelatedEntityProperty.AndSoON
Обратите внимание, что при создании столбцов Grid вы можете указать
.SortColumnName("User.UserName")