创建一个排序函数的泛型列表 [英] Creating a sort function for a generic list
本文介绍了创建一个排序函数的泛型列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我对由对象字段排序泛型列表的方法:
I have a method for sorting generic lists by the object fields:
public static IQueryable<T> SortTable<T>(IQueryable<T> q, string sortfield, bool ascending)
{
var p = Expression.Parameter(typeof(T), "p");
if (typeof(T).GetProperty(sortfield).PropertyType == typeof(int?))
{
var x = Expression.Lambda<Func<T, int?>>(Expression.Property(p, sortfield), p);
if (ascending)
q = q.OrderBy(x);
else
q = q.OrderByDescending(x);
}
else if (typeof(T).GetProperty(sortfield).PropertyType == typeof(int))
{
var x = Expression.Lambda<Func<T, int>>(Expression.Property(p, sortfield), p);
if (ascending)
q = q.OrderBy(x);
else
q = q.OrderByDescending(x);
}
else if (typeof(T).GetProperty(sortfield).PropertyType == typeof(DateTime))
{
var x = Expression.Lambda<Func<T, DateTime>>(Expression.Property(p, sortfield), p);
if (ascending)
q = q.OrderBy(x);
else
q = q.OrderByDescending(x);
}
// many more for every type
return q;
}
有什么办法我可以折叠的IFS到一个通用的声明?
的主要问题是,对于部分
Expression.Lambda< Func键< T,INT>>
我不知道怎么样它一般写的。
Is there any way I can collapse those ifs to a single generic statement?
The main problem is that for the part
Expression.Lambda<Func<T, int>>
I am not sure how to write it generically.
推荐答案
如果您展开 Queryable.OrderBy
来它的定义,那么你就不必使用 Expression.Lambda
通用过载:
If you expand Queryable.OrderBy
to its definition then you don't have to use the generic overload of Expression.Lambda
:
public static IQueryable<T> SortTable<T>(
IQueryable<T> q, string sortfield, bool ascending)
{
var p = Expression.Parameter(typeof(T), "p");
var x = Expression.Lambda(Expression.Property(p, sortfield), p);
return q.Provider.CreateQuery<T>(
Expression.Call(typeof(Queryable),
ascending ? "OrderBy" : "OrderByDescending",
new Type[] { q.ElementType, x.Body.Type },
q.Expression,
x));
}
这篇关于创建一个排序函数的泛型列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文