EF架构~真正被封装的排序方法,支持多列排序
对于linq to sql 和linq to entity来说,当你把获取数据的方法封装了之后,总觉得还缺点什么,想了之后,应该是排序,但看了微软的orchard项目之后,觉得它的排序封装的并不好,而且还有多列排序的问题,所以,我自己又改进了一下,首先提出一个与分层无关的IOrderable接口的概念,它是为了让WEB,BLL,DATA层之间解耦的,其次增加了ThenAsc和ThenDesc让它们支持多列排序,orchard项目里,之前是使用参数来实现的,最多支持3列排序,而且不支持升降混排的情况,呵呵。
看一个IOrderable接口
/// <summary>
/// 排序规范
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IOrderable<T>
{
/// <summary>
/// 递增
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="keySelector"></param>
/// <returns></returns>
IOrderable<T> Asc<TKey>(global::System.Linq.Expressions.Expression<Func<T, TKey>> keySelector);
/// <summary>
/// 然后递增
/// </summary>
/// <typeparam name="TKey1"></typeparam>
/// <typeparam name="TKey2"></typeparam>
/// <param name="keySelector1"></param>
/// <returns></returns>
IOrderable<T> ThenAsc<TKey>(Expression<Func<T, TKey>> keySelector);
/// <summary>
/// 递减
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="keySelector"></param>
/// <returns></returns>
IOrderable<T> Desc<TKey>(global::System.Linq.Expressions.Expression<Func<T, TKey>> keySelector);
/// <summary>
/// 然后递减
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="keySelector"></param>
/// <returns></returns>
IOrderable<T> ThenDesc<TKey>(Expression<Func<T, TKey>> keySelector);
/// <summary>
/// 排序后的结果集
/// </summary>
global::System.Linq.IQueryable<T> Queryable { get; }
}
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方法里了,看代码:
public IQueryable<TEntity> GetModel(Action<IOrderable<TEntity>> orderBy)
{
var linq = new Orderable<TEntity>(GetModel());
orderBy(linq);
return linq.Queryable;
}
如果在其它层调用,可以自己去实例化Action<IOrderable<TEntity>>这个对象,如代码:
backgroundEntities1 db = new backgroundEntities1();
DbContextRepository<WebManageUsers> user = new DbContextRepository<WebManageUsers>(db);
Action<IOrderable<WebManageUsers>> orderBy = query => query.Asc(j => j.DepartmentID)
.ThenDesc(j => j.ManageUserID);
user.GetModel(orderBy).ToList().ForEach(k =>
{
Console.WriteLine("部门:" + k.DepartmentID + ",用户 :" + k.ManageUserID);
});
上面的代码是先对DepartmentID进行升序,再对ManageUserID进行降序,看一下结果如图:
EF架构~真正被封装的排序方法,支持多列排序的更多相关文章
- 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)
2013-08-22 14:55:33 八大排序方法汇总(选择排序-简单选择排序.堆排序,插入排序-简单插入排序.shell排序,交换排序-冒泡排序.快速排序,归并排序,计数排序). 插入排序还可以和 ...
- java排序方法中的选择排序方法
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完. package array; //选择排序方法 public class arra ...
- Jtable 表格按多列排序(支持中文汉字排序)
这两天公司让做一个Jtable表格的排序,首先按A列排序,在A列相等时按B列排序,B列相等时按C列排序,ABC三列可以任意指定,最多分三列,这样的一个需求.由于我是大神,所以必须做了出来.ok,不自恋 ...
- 剖析Javascript中sort()使用方法,以及重写sort()里的排序方法,实现自定义排序
语法:arrayObject.sort([compareFunction]):参数compareFunction可选.规定排序顺序,必须是函数. sort() 方法用于对数组的元素进行排序,并返回数组 ...
- mysql 字段指定值靠前排序方法,多字段排序排序方法
背景:SEO下选择某查询条件 查询展示信息为装修设计师以及设计师作品.设计师原型设计为:选择某风格 例如:简约,则列表出现拥有简约风格的设计师信息以及该设计师类型为简约的作品(3条靠前记录) 浏览原型 ...
- PHP——封装Curl请求方法支持POST | DELETE | GET | PUT 等
前言 Curl: https://www.php.net/manual/en/book.curl.php curl_setopt: https://www.php.net/manual/en/fun ...
- SQL 先固定特殊的几行数据之外再按照某一字段排序方法(CASE 字段排序(CASE WHEN THEN)
查询用户表的数据,管理员用户始终在最前面,然后再按照CreateTime排序: SELECT TOP * FROM [dbo].[User] WHERE ParentID = '**' ORDER B ...
- C# asp.net repeater实现排序功能,自动排序,点击头部排序,点击列排序
在网上看到好多关于repeater排序的,自己动手用了,发现一些问题,贴源码后把发现的问题以及解决方法给出 repeater实现排序功能(单击升序排列,再单击降序排列).原理很简单,在<TD&g ...
- c#实现几种排序方法
插入排序 1.简介 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序 ...
随机推荐
- 8421BCD码转换为十进制
这个转换和随意的认知是不同的,要了解BCD码和二进制码的区别 #define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10) ...
- liunx 多个tomcat 产生的新问题
今天在给 tomcat 版本7.0.57升级到7.0.72的时候,碰到一个奇怪的问题,启动 tomcat7.0.72 的时候报错,找不到tomcat7.0.57/bin/setclasspath.sh ...
- 使用doxygen制作C代码文档
使用doxygen制作C代码文档 C 代码注释风格约定 行间注释 /*! * * 这里是注释 * */ 行内注释 <code here> /*! 这里是注释 */ doxygen 风格的宏 ...
- 转发 win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files 解决方案
win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NE ...
- Python学习之路--进程,线程,协程
进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Q ...
- VC CComboBox用法总结
VC每日一练,虽然简单,不动手试一下不能真正记住. 大气象 CComboBox *comboBox=(CComboBox*)GetDlgItem(IDC_COMBO1); comboBox->I ...
- 利用反射实现类通用的DAO层
public void add(Object object) throws SQLException { ResultSet rs=null; PreparedStatement ps=null; C ...
- MVC特性
MVC与ASP.NET MVC基础概念 MVC是Model-View-Controller的缩写. MVC将应用程序划分为3大组件:模型\视图\控制器. MVC不是ASP.NET所特有,它只是一种开发 ...
- mac下配置openCV
预备工作: 1.下载Homebrew 在Terminal中输入: ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)" ...
- linux延时关机
04.shutdown +2 "The machine will shutdown" # 2min 后关机,并通知在线者 05.shutdown -h now 立刻关机,其中now ...