public interface IOrderByExpression<TEntity> where TEntity : class
{
IOrderedQueryable<TEntity> ApplyOrderBy(IQueryable<TEntity> query);
IOrderedQueryable<TEntity> ApplyThenBy(IOrderedQueryable<TEntity> query);
}
public class OrderByExpression<TEntity, TOrderBy> : IOrderByExpression<TEntity>
where TEntity : class
{
private Expression<Func<TEntity, TOrderBy>> _expression;
private bool _descending; public OrderByExpression(Expression<Func<TEntity, TOrderBy>> expression,
bool descending = false)
{
_expression = expression;
_descending = descending;
} public IOrderedQueryable<TEntity> ApplyOrderBy(
IQueryable<TEntity> query)
{
if (_descending)
return query.OrderByDescending(_expression);
else
return query.OrderBy(_expression);
} public IOrderedQueryable<TEntity> ApplyThenBy(
IOrderedQueryable<TEntity> query)
{
if (_descending)
return query.ThenByDescending(_expression);
else
return query.ThenBy(_expression);
}
}
 

调用方法

public static class IQueryableHelper
{
/// <summary>
/// IQueryable 接口的多字段排序 请在执行底层时使用
/// </summary>
/// <typeparam name="TEntity">目标类型</typeparam>
/// <param name="query"></param>
/// <param name="orderByExpressions"></param>
/// <returns></returns>
public static IQueryable<TEntity> ApplyOrderBy<TEntity>(this IQueryable<TEntity> query,
params IOrderByExpression<TEntity>[] orderByExpressions)
where TEntity : class
{
if (orderByExpressions == null)
return query;
IOrderedQueryable<TEntity> output = null; foreach (var orderByExpression in orderByExpressions)
{
if (output == null)//检查是否是第一次
output = orderByExpression.ApplyOrderBy(query);
else
output = orderByExpression.ApplyThenBy(output);
} return output ?? query;
}
}

调用处

 using (var db = ConnectionHelper.GetConn())
{
var list = db.tb_Store.ApplyOrderBy(new OrderByExpression<tb_Store, string>(u => u.StorePhone),
new OrderByExpression<tb_Store, string>(u => u.StoreCode, true)
).Skip(skip).Take(take);//用自己写的扩展方法代替原来的orderby
var xx = ((ObjectQuery)list).ToTraceString(); //这里可以看一下生成的sql语句
}

Entity Framework 4、5 多字段排序的更多相关文章

  1. Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 排序、筛选、分页以及分组

    Sorting, filtering, paging, and grouping 7 of 8 people found this helpful By Tom Dykstra The Contoso ...

  2. linq to entity asp.net mvc 多字段排序

    字段1 降序 字段2 降序 var str = db.xxx.OrderByDescending(p=>p.字段1).ThenByDescending(p=>p.字段2) ThenBy - ...

  3. 解决Entity Framework中DateTime类型字段异常

    从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值 具体的错误原因是:C#中的DateTime类型比SqlServer中的datetime范围大.SqlServe ...

  4. Entity Framework 第七篇 简化排序

    上篇介绍了EF的分页实现,分页的时候会用到排序,但是使用起来表达式写的似乎很繁琐 , ); 如果直接使用排序字符串,不更直观简便么? respository.GetPaged<S_Users&g ...

  5. Entity Framework中实现指定字段更新

    foreach (var entity in databasePatents) { var patentTmp = sourcePClist.FirstOrDefault(p => p.Oid ...

  6. Entity Framework 6 实体某些字段根据模型状态进行自动更新内容

    1.定义基础实体对象 public class BaseEntity { public int Id { get; set; } public DateTime? CreateTime { get; ...

  7. entity framework 5 更新指定字段

    dbSet.Attach(good); var stateEntry = ((IObjectContextAdapter)context).ObjectContext. ObjectStateMana ...

  8. Entity Framework技巧系列之一 - Tip 1 - 5

    提示1. 在Entity Framework中怎样排序关系(Relationships) 问题: 在Entity Framework论坛中常会看到关于排序相关联项目的问题. 例如,想象你要查询客户,并 ...

  9. entity framework 实现按照距离排序

    在做项目时,经常会遇到“离我最近”这种需求.顾名思义,它需要根据用户的经纬度和事物的经纬度计算距离,然后进行排序,最后分页(当然这些操作要在数据库中进行,否则就变成假分页了). 我们通常可以用sql语 ...

随机推荐

  1. Django过滤器列表

    Django 模板过滤器也是我们在以后基于 Django 网站开发过程中会经常遇到的,如显示格式的转换.判断处理等.以下是 Django 过滤器列表,希望对为大家的开发带来一些方便. 一.形式:小写 ...

  2. struts2下s:iterator取不出值

    1:问题起因:通过action方法连接数据库取出Arraylist集合,在前台页面遍历显示无数据,用s:debug查看 stack里有值,用了各种方法,包括session传值,但是仍然取不出来. 2: ...

  3. 平行四边形TikZ作图

    %!TEX program = pdflatex \documentclass[varwidth=true, border=2pt]{standalone} \usepackage{tikz} \us ...

  4. eclipse javascript验证报错

    项目右键->properties

  5. swift 获取控件位置 大小

    var SearchBtn = uibutton() SearchBtn.frame.origin.x   //获取坐标x SearchBtn.frame.origin.Y  // 获取坐标Y Sea ...

  6. eclipse tomcat maven热部署

    1.  tomcat插件 如果是Kepler的话,已经自带了tomcat插件,如果没有,到http://www.eclipsetotale.com/tomcatPlugin.html下载安装或在线安装 ...

  7. shell中单引号和双引号

    在shell中声明变量后直接使用: #!/bin/bash na=zhagnsan ag=11 echo '$na is $ag years old' 输出:$na is $ag years old ...

  8. Blob(二进制)、byte[]、long、date之间的类型转换

    String转成byte[]类型存入数据库,数据库字段对应byte[]的类型为Blob类型 String value = this.getParamNotNnll("bgvalue" ...

  9. MVC学习(四)几种分页的实现(2)

    在第一种分页方式中,仅仅实现了分页,但并未有体现出MVC的优势,没有体现出泛型编程思想,尤其在数据量很大的时候,分页十分缓慢,除此之外,还没有实现很好的封装,不是一个通用方法. 因此,我希望只要传入数 ...

  10. [刘阳Java]_Java技术有哪些学习重点_第1讲

    纵观网上有很多非常好的对Java技术的总结,这里我个人谈谈对Java技术学习有哪些重点内容[浮浅之见] Java环境搭建 Java基础语法 Java面向对象编程 Java异常 Java IO流 Jav ...