首页 > 解决方案 > 使用 Func 进行动态排序, IOrderedQueryable>

问题描述

我想根据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);

标签: c#sorting.net-coredynamic-linq

解决方案


我写了一个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);
    }

}

因此,此扩展方法将应用字段列表IQueryable以使用“OrderBy”(如果是第一次)或“ThenBy”(否则)对源进行排序。

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

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

推荐阅读