传入排序的格式为 it.groupid desc 或 it.groupname asc 等
static IOrderedQueryable<T> ApplyOrder<T>(IQueryable<T> source, string property)
{
string methodName = "OrderBy";
string[] props = property.Split('.'); Type type = typeof(T);
ParameterExpression arg = Expression.Parameter(type, "x"); Expression expr = arg;
string prop = props[1].Split(' ')[0];
string sort = props[1].Split(' ')[1];
if (sort.Equals("desc"))
{
methodName = "OrderByDescending";
}
if (sort.Equals("asc"))
{
methodName = "OrderBy";
}
PropertyInfo pi = type.GetProperty(prop);
expr = Expression.Property(expr, pi);
type = pi.PropertyType;
//foreach (string prop in props)
//{ // use reflection (not ComponentModel) to mirror LINQ
// PropertyInfo pi = type.GetProperty(prop);
// expr = Expression.Property(expr, pi);
// type = pi.PropertyType;
//}
Type delegateType = typeof(Func<,>).MakeGenericType(typeof(T), type);
LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg);
object result = typeof(Queryable).GetMethods().Single(
method => method.Name == methodName
&& method.IsGenericMethodDefinition
&& method.GetGenericArguments().Length == 2
&& method.GetParameters().Length == 2)
.MakeGenericMethod(typeof(T), type)
.Invoke(null, new object[] { source, lambda });
return (IOrderedQueryable<T>)result;
}
调用:
public IQueryable<gps_drivers> GetGps_driversBySort(string sort, string keyword, string userloginname)
{
var item=from x in ObjectContext.gps_drivers
join y in this.ObjectContext.gps_group_users on x.GroupID equals y.GroupID
where y.UserLoginName.Equals(userloginname)
select x ;
int i = item.Count();
return ApplyOrder<gps_drivers>(item, sort);
}
参考 http://stackoverflow.com/questions/41244/dynamic-linq-orderby
static IOrderedQueryable<T> ApplyOrder<T>(IQueryable<T> source, string property, string methodName) {
string[] props = property.Split('.');
Type type = typeof(T);
ParameterExpression arg = Expression.Parameter(type, "x");
Expression expr = arg; foreach(string prop in props)
{ // use reflection (not ComponentModel) to mirror LINQ
PropertyInfo pi = type.GetProperty(prop);
expr = Expression.Property(expr, pi);
type = pi.PropertyType;
}
Type delegateType = typeof(Func<,>).MakeGenericType(typeof(T), type);
LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg);
object result = typeof(Queryable).GetMethods().Single(
method => method.Name == methodName
&& method.IsGenericMethodDefinition
&& method.GetGenericArguments().Length == 2
&& method.GetParameters().Length == 2)
.MakeGenericMethod(typeof(T), type)
.Invoke(null, new object[] { source, lambda });
return (IOrderedQueryable<T>)result;
}