c# 扩展LINQ的order by函数支持通过字符串来指定列名并支持多列

本文介绍了一种使用Linq进行多字段排序的方法,并提供了一个实用的扩展方法OrderBy,该方法接受一个字符串参数,该参数包含多个字段及其排序方向,从而实现灵活且便捷的多字段排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文借鉴了https://blog.youkuaiyun.com/lan_liang/article/details/68523451。

将字符串转换为orderby的linq可以极大地减少重复劳动,可是该怎样将多个字段转换为Order()及ThenBy()表达式呢?可以参照以下代码:

public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> q, string condition)
        {
            string[] conditions = condition.Split(',');

            if (conditions.Length==0)
            {
                return (IOrderedQueryable<T>) q;
            }

            IOrderedQueryable<T> res = null;

            for (int i = 0; i < conditions.Length; i++)
            {
                string[] strings = conditions[i].Split(" ");
                var fieldName = strings[0];
                var direction = strings[1];

                var param = Expression.Parameter(typeof(T), "p");
                var prop = Expression.Property(param, fieldName);
                var exp = Expression.Lambda(prop, param);

                string method;

                if (i==0)
                {
                    method = direction.ToLower() == "asc" ? "OrderBy" : "OrderByDescending";
                }
                else
                {
                    method = direction.ToLower() == "asc" ? "ThenBy" : "ThenByDescending";
                }
                Type[] types = { q.ElementType, exp.Body.Type };
                var mce = i==0? Expression.Call(typeof(Queryable), method, types, q.Expression, exp): Expression.Call(typeof(Queryable), method, types, res.Expression, exp);

                if (conditions.Length == 1)
                {
                    return (IOrderedQueryable<T>)q.Provider.CreateQuery<T>(mce);
                }

                res = i == 0 ? (IOrderedQueryable<T>) q.Provider.CreateQuery<T>(mce) : (IOrderedQueryable<T>)res.Provider.CreateQuery<T>(mce);
            }
            return res;

        }

 

IQueryable对象调用Orderby方法,传入"Id desc,Age desc"格式的字符串即可实现多列排序。

 

转载于:https://www.cnblogs.com/axel10/p/9240602.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值