打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
EF架构~真正被封装的排序方法,支持多列排序

对于linq to sql 和linq to entity来说,当你把获取数据的方法封装了之后,总觉得还缺点什么,想了之后,应该是排序,但看了微软的orchard项目之后,觉得它的排序封装的并不好,而且还有多列排序的问题,所以,我自己又改进了一下,首先提出一个与分层无关的IOrderable接口的概念,它是为了让WEB,BLL,DATA层之间解耦的,其次增加了ThenAsc和ThenDesc让它们支持多列排序,orchard项目里,之前是使用参数来实现的,最多支持3列排序,而且不支持升降混排的情况,呵呵。

看一个IOrderable接口

OK,下面是为接口的一个实现,这个实现我是放在Data层的,因为它是与ORM架构有关的,可能你的linq与ado.net的排序实现是不同的,所以,不能放在entity层,我的习惯是,所有linq特有的都放在linq架构的Data层(如,IQueryable,这就是linq特有的,而list,IEnumerable等扩展应该放在entity层)

namespace EntityFrameworks.Data.Core{    /// <summary>    /// Linq架构里对集合排序实现    /// </summary>    /// <typeparam name="T"></typeparam>    public class Orderable<T> : IOrderable<T>    {        private IQueryable<T> _queryable;        /// <summary>        /// 排序后的结果集        /// </summary>        /// <param name="enumerable"></param>        public Orderable(IQueryable<T> enumerable)        {            _queryable = enumerable;        }        /// <summary>        /// 排序之后的结果集        /// </summary>        public IQueryable<T> Queryable        {            get { return _queryable; }        }        /// <summary>        /// 递增        /// </summary>        /// <typeparam name="TKey"></typeparam>        /// <param name="keySelector"></param>        /// <returns></returns>        public IOrderable<T> Asc<TKey>(Expression<Func<T, TKey>> keySelector)        {            _queryable = (_queryable as IOrderedQueryable<T>)                .OrderBy(keySelector);            return this;        }        /// <summary>        /// 然后递增        /// </summary>        /// <typeparam name="TKey"></typeparam>        /// <param name="keySelector"></param>        /// <returns></returns>        public IOrderable<T> ThenAsc<TKey>(Expression<Func<T, TKey>> keySelector)        {            _queryable = (_queryable as IOrderedQueryable<T>)                .ThenBy(keySelector);            return this;        }        /// <summary>        /// 递减        /// </summary>        /// <typeparam name="TKey"></typeparam>        /// <param name="keySelector"></param>        /// <returns></returns>        public IOrderable<T> Desc<TKey>(Expression<Func<T, TKey>> keySelector)        {            _queryable = _queryable                .OrderByDescending(keySelector);            return this;        }        /// <summary>        /// 然后递减        /// </summary>        /// <typeparam name="TKey"></typeparam>        /// <param name="keySelector"></param>        /// <returns></returns>        public IOrderable<T> ThenDesc<TKey>(Expression<Func<T, TKey>> keySelector)        {            _queryable = (_queryable as IOrderedQueryable<T>)                .ThenByDescending(keySelector);            return this;        }    }}

而这个排序的方法,可以单独被BLL层使用,自己去组装它,也可以在Data层提供的GetModel()方法里直接使用,因为我的架构里已经有排序功能拟合到GetModel方法里了,看代码:

如果在其它层调用,可以自己去实例化Action<IOrderable<TEntity>>这个对象,如代码:

上面的代码是先对DepartmentID进行升序,再对ManageUserID进行降序,看一下结果如图:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Linq表达式拓展类(Or条件,排除重复等)
应用程序框架实战二十二 : DDD分层架构之仓储(层超类型基础篇)
8大排序算法之:桶排序(Bucket Sort)
系统架构师
.net core 反射的介绍与使用
多线程之旅(Thread)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服