using System;
/// <summary>
/// 排序规范
/// </summary>
/// <typeparam name="T"></typeparam>
using System.Linq.Expressions;
public interface ISortable<T>
{
/// <summary>
/// 递增
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="keySelector"></param>
/// <returns></returns>
ISortable<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>
ISortable<T> ThenAsc<TKey>(Expression<Func<T, TKey>> keySelector);
/// <summary>
/// 递减
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="keySelector"></param>
/// <returns></returns>
ISortable<T> Desc<TKey>(global::System.Linq.Expressions.Expression<Func<T, TKey>> keySelector);
/// <summary>
/// 然后递减
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="keySelector"></param>
/// <returns></returns>
ISortable<T> ThenDesc<TKey>(Expression<Func<T, TKey>> keySelector);
/// <summary>
/// 排序后的结果集
/// </summary>
global::System.Linq.IQueryable<T> Queryable { get; }
}

实现接口:

using System;
using System.Linq;
using System.Linq.Expressions;
namespace EntityFrameworks.Data.Core
{
/// <summary>
/// Linq架构里对集合排序实现
/// </summary>
/// <typeparam name="T"></typeparam>
public class Orderable<T> : ISortable<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 ISortable<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 ISortable<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 ISortable<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 ISortable<T> ThenDesc<TKey>(Expression<Func<T, TKey>> keySelector)
{
_queryable = (_queryable as IOrderedQueryable<T>)
.ThenByDescending(keySelector);
return this;
}
}
}

封装一个ISortable接口的更多相关文章

  1. C 封装一个简单二叉树基库

    引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而  没有遭受到冷 ...

  2. 使用libzplay库封装一个音频类

    装载请说明原地址,谢谢~~      前两天我已经封装好一个duilib中使用的webkit内核的浏览器控件和一个基于vlc的用于播放视频的视频控件,这两个控件可以分别用在放酷狗播放器的乐库功能和MV ...

  3. 简易封装一个带有占位文字的TextView

    在实际iOS应用开发中我们经常会用到类似于下图所示的界面,即带有占位文字的文本框:

  4. uinty3d使用ugui封装一个分页控件

    我们在显示数据时有的数据比较多,手机内存有限,我们不可能分配很多的控件来显示这些数据,分页是一个不错的选择.比如玩家交易行.我们现在封装一个自己简单的分页控件来显示玩家交易行. 分页控件的原理其实很简 ...

  5. 封装一个Ajax工具函数

    /*封装一个ajax工具函数*/ window.$ = {}; /*通过$定义一个ajax函数*/ /* * 1. type   string   请求的方式  默认是get * 2. url     ...

  6. iOS回顾笔记(05) -- 手把手教你封装一个广告轮播图框架

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  7. [js高手之路] 跟GhostWu一起封装一个字符串工具库-架构篇(1)

    所谓字符串工具库就是利用javascript面向对象的知识封装一个常用的字符串处理方法库,首先给这个库起个名字,好吧就叫ghostwu.js. 看下ghostwu.js的整体架构: ; (functi ...

  8. 网络游戏开发-服务器(01)Asp.Net Core中的websocket,并封装一个简单的中间件

    先拉开MSDN的文档,大致读一遍 (https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/websockets) WebSocket 是一 ...

  9. 1.使用C++封装一个链表类LinkList

     使用C++封装一个链表类LinkList.写出相应一个测试用例 链表需要提供 添加 修改删除 除重 合并 排序创建 销毁等接口. 不能调用库函数或者使用STL等类库 题目延伸********** ...

随机推荐

  1. nginx错误汇总

    一.Nginx出现413 Request Entity Too Large错误解决方法 Nginx出现的413 Request Entity Too Large错误,这个错误一般在上传文件的时候出现, ...

  2. [Raobin] Ext.net在页面中以窗体的形式打开另外的页面

    public ActionResult NewPartWindow(string id, string copy, string code) { var vm = new VM(this); var ...

  3. 【HTML】Intermediate6:Text: Addresses, Definitions, Bi-directional, and Editorial

    1.</address> It should be used specifically for the contact details relating either to the ent ...

  4. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程04:技能的输入与检测》

    4.技能的输入与检测 概述: 技能系统的用户体验,制约着玩家对整个游戏的体验.游戏角色的技能华丽度,连招的顺利过渡,以及逼真的打击感,都作为一款游戏的卖点吸引着玩家的注意.开发者在开发游戏初期,会根据 ...

  5. POJ2773 - Happy 2006(欧拉函数)

    题目大意 给定两个数m,k,要求你求出第k个和m互质的数 题解 我们需要知道一个等式,gcd(a,b)=gcd(a+t*b,b) 证明如下:gcd(a+t*b,b)=gcd(b,(a+t*b)%b)= ...

  6. 仿写thinkphp的I方法

    自己定义一个方法仿写thinkphp的I 方法 <?php function I($key="",$default='',$function="") { ...

  7. 遇到Class Not registered的COM异常怎么办

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:遇到Class Not registered的COM异常怎么办.

  8. Shell脚本编程的常识

    (这些往往是经常用到,但是各种网络上的材料都语焉不详的东西,个人认为比较有用) 七种文件类型 d            目录                                       ...

  9. cocos2d-x 屏幕适配新解

    转自:http://blog.leafsoar.com/archives/2013/05-10-19.html 为了适应移动终端的各种分辨率大小,各种屏幕宽高比,在 cocos2d-x(当前稳定版:2 ...

  10. PowerShell运行cmd命令

    1.使用.exe扩展名 2.使用 cmd /c "" 3.在 PowerShell v3 中有另一种选择来解决这个问题,只需在命令行的任意位置添加 –% 序列(两个短划线和一个百分 ...