使用 Func<IQueryable<T>、IOrderedQueryable 进行动态排序<T>>



我想根据Id、Nam、Phone和Email来查询结果并按顺序显示。有人能帮我吗。预期结果

table1result=> table1.OrderBy(c => c.Id).ThenBy(c => c.Name).ThenBy(c => c.table2.Name).ThenBy(c=>c.table2.Phone)

下面是导致的示例代码

Func<IQueryable<T>, IOrderedQueryable<T>> orderExpression = o => o.OrderBy(a => a.Id);
switch(case)
{
case "Id" : orderExpression = o => o.OrderBy(a => a.Id);
break;
case "name" : orderExpression = o => o.OrderBy(a => a.Name);
break;
case "phone" : orderExpression = o => o.OrderBy(a => a.table2.phone);
break;
.
.
.
.
}
which result in 
table1result=> table1.OrderBy(a => a.Id);

我写了一个IQueryable<T>扩展,也许这对您的情况会有所帮助:

public static class QueryableExtensions
{
public static IQueryable<T> SortBy<T>(this IQueryable<T> source, 
IEnumerable<string> fieldsToSort)
{
Expression expression = source.Expression;
bool firstTime = true;
foreach (var f in fieldsToSort)
{
// { x }
var parameter = Expression.Parameter(typeof(T), "x");
// { x.FIELD }, e.g, { x.ID }, { x.Name }, etc
var selector = Expression.PropertyOrField(parameter, f);
// { x => x.FIELD }
var lambda = Expression.Lambda(selector, parameter);
// You can include sorting directions for advanced cases
var method = firstTime
? "OrderBy" 
: "ThenBy";
// { OrderBy(x => x.FIELD) }
expression = Expression.Call(
typeof(Queryable), 
method,
new Type[] { source.ElementType, selector.Type },
expression, 
Expression.Quote(lambda)
);
firstTime = false;
}
return firstTime 
? source
: source.Provider.CreateQuery<T>(expression);
}
}

因此该扩展方法将应用字段列表在CCD_ 2源上进行排序;OrderBy";(如果是第一次(或";ThenBy";(否则(。

然后你可以像这样使用它:

var table1Result = table1
.SortBy(new string[] { "Id", "Name", "Phone" });

最新更新