Skip to content

Instantly share code, notes, and snippets.

@mvidacovich
Created July 29, 2015 18:23
Show Gist options
  • Save mvidacovich/cd8cc1af35a964c43756 to your computer and use it in GitHub Desktop.
Save mvidacovich/cd8cc1af35a964c43756 to your computer and use it in GitHub Desktop.
Queryable extension for sorting on strings
void Main()
{
var collection = Student; // all students
collection.OrderBy("FirstName",true).Skip(0).Take(50).Select (s => new {s.StudentId, s.FirstName}).Dump();
collection.OrderBy("FirstName",true).Skip(50).Take(50).Select (s => new {s.StudentId, s.FirstName}).Dump();
}
public static class SortHelper
{
public static IQueryable<T> OrderBy<T>(this IQueryable<T> queryable, string propertyName, bool asc)
{
var fieldToSort = typeof(T).GetFields().FirstOrDefault (x => x.Name == propertyName);
if(fieldToSort != null)
{
return queryable.OrderBy (fieldToSort,asc);
}
var propertyToSort = typeof(T).GetProperties().FirstOrDefault (x => x.Name == propertyName);
if(propertyToSort != null)
{
return queryable.OrderBy (propertyToSort,asc);
}
throw new ArgumentException("Invalid property / field name");
}
public static IQueryable<T> OrderBy<T>(this IQueryable<T> queryable, PropertyInfo propertyInfo, bool asc)
{
var method = typeof(SortHelper).GetMethod("ApplyTypeSortProperty", BindingFlags.NonPublic | BindingFlags.Static);
var generic = method.MakeGenericMethod(typeof(T),propertyInfo.PropertyType);
return (IQueryable<T>)generic.Invoke(null, BindingFlags.NonPublic | BindingFlags.Static, null, new object[] { queryable, propertyInfo, asc }, null);
}
public static IQueryable<T> OrderBy<T>(this IQueryable<T> queryable, FieldInfo fieldInfo, bool asc)
{
var method = typeof(SortHelper).GetMethod("ApplyTypeSortField", BindingFlags.NonPublic | BindingFlags.Static);
var generic = method.MakeGenericMethod(typeof(T),fieldInfo.FieldType);
return (IQueryable<T>)generic.Invoke(null, BindingFlags.NonPublic | BindingFlags.Static, null, new object[] { queryable, fieldInfo, asc }, null);
}
private static IQueryable<T> ApplyTypeSortField<T,TProperty>(IQueryable<T> queryable, FieldInfo fieldInfo, bool asc)
{
var paramExpr = Expression.Parameter(typeof(T), "x");
var propertyExpr = Expression.Field(paramExpr, fieldInfo);
var propertyLambdaExpr = Expression.Lambda<Func<T, TProperty>>(propertyExpr, paramExpr);
return asc ? queryable.OrderBy(propertyLambdaExpr) : queryable.OrderByDescending(propertyLambdaExpr);
}
private static IQueryable<T> ApplyTypeSortProperty<T,TProperty>(IQueryable<T> queryable, PropertyInfo propertyInfo, bool asc)
{
var paramExpr = Expression.Parameter(typeof(T), "x");
var propertyExpr = Expression.Property(paramExpr, propertyInfo);
var propertyLambdaExpr = Expression.Lambda<Func<T, TProperty>>(propertyExpr, paramExpr);
return asc ? queryable.OrderBy(propertyLambdaExpr) : queryable.OrderByDescending(propertyLambdaExpr);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment