C# 使用Linq.Expressions.Expression进行排序

C# 使用Linq.Expressions.Expression进行排序,c#,.net,linq,sorting,expression-trees,C#,.net,Linq,Sorting,Expression Trees,我编写了这段代码,按照列sortColumn对IQueryable进行排序。我想扩展它,使BirthDate列的值等于DateTime的条目。今天将被放在排序的第一位,但我就是找不到或想不出如何做这项工作 public static IQueryable<T> OrderByField<T>(this IQueryable<T> q, string sortColumn, bool asc) { var param = Expression.Param

我编写了这段代码,按照列
sortColumn
IQueryable
进行排序。我想扩展它,使
BirthDate
列的值等于
DateTime的条目。今天
将被放在排序的第一位,但我就是找不到或想不出如何做这项工作

public static IQueryable<T> OrderByField<T>(this IQueryable<T> q, string sortColumn, bool asc)
{
    var param = Expression.Parameter(typeof(T), "p");

    var prop = Expression.Property(param, sortColumn);

    var exp = Expression.Lambda(prop, param);

    string method = asc ? "OrderBy" : "OrderByDescending";

    Type[] types = new[] { q.ElementType, exp.Body.Type };

    var mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);

    return q.Provider.CreateQuery<T>(mce);
}
公共静态IQueryable OrderByField(此IQueryable q,字符串sortColumn,bool asc)
{
var param=表达式参数(类型(T),“p”);
var prop=Expression.Property(param,sortColumn);
var exp=表达式Lambda(prop,param);
string method=asc?“OrderBy”:“OrderByDescending”;
Type[]types=new[]{q.ElementType,exp.Body.Type};
var mce=Expression.Call(typeof(Queryable)、方法、类型、q.Expression、exp);
返回q.Provider.CreateQuery(mce);
}
请参见

公共静态类SortExpressionBuilder
{
私有静态IDictionary方向=新字典
{
{SortDirection.Ascending,new OrderByAscendingSortExpression()},
{SortDirection.Descending,new OrderByDescendingSortExpression()}
};
接口ISortExpression
{
Func GetExpression();
}
类OrderByAscendingSortExpression:ISortExpression
{
公共函数GetExpression()
{
返回(c,f)=>c.OrderBy(f);
}
}
类OrderByDescendingSortExpression:ISortExpression
{
公共函数GetExpression()
{
返回(c,f)=>c.OrderByDescending(f);
}
}
公共静态Func CreateExpression(排序方向)
{
返回方向[direction].GetExpression();
}
}
公共静态IEnumerable OrderBy(此IEnumerable集合、字符串列名称、SortDirection方向)
{
ParameterExpression param=Expression.Parameter(typeof(T),“x”);//x
Expression property=Expression.property(param,columnName);//x.columnName
Func Func=Expression.Lambda(//x=>x.ColumnName
Expression.Convert(Expression.Property(param,columnName),
类型(对象)),参数
).Compile();
Func expression=SortExpressionBuilder.CreateExpression(方向);
IEnumerable sorted=表达式(集合,func);
返回排序;
}
和底部的链接:


您可以尝试对类似于以下表达式的内容进行排序:

.OrderBy(x => BirthDate == DateTime.Now.Date ? 0 : 1).ThenBy(sortColumn);

请参阅:这会起作用,但是我不能使用参数“sortColumn”对所需的任何列进行排序,除非我使用大量if(){}。首先,您是否应该在这里返回一个
IOrderedQueryable
?其次,您不能创建另一个扩展
IOrderedQueryable
的副本,而不是使用
ThenBy
thenbysending
作为
Queryable
方法的
IQueryable
.OrderBy(x => BirthDate == DateTime.Now.Date ? 0 : 1).ThenBy(sortColumn);