前言:在使用EF当中,肯定会遇到动态查询的需求,建立一个公共调用的动态组合表达式查询也是必不可少的,以下是建立动态组合多排序字段做个记录,供以后调用

1、建立一个结构,用于多个排序字段组合,这个结构体有两个字段,一个是需要排序的属性名,一个是是否是升序降序的判断

 public struct OrderModelField
{
public string propertyName { get; set; }
public bool IsDESC { get; set; }
}

组合方法

   public IList<T> GetAllEntity(Expression<Func<T, bool>> condition, int pageIndex, int pageSize, out long total, params OrderModelField[] orderByExpression)
{
//条件过滤
var query = this.QQYALIEntities.Set<T>().Where(condition); //创建表达式变量参数
var parameter = Expression.Parameter(typeof(T), "o"); if (orderByExpression != null && orderByExpression.Length > )
{
for (int i = ; i < orderByExpression.Length; i++)
{
//根据属性名获取属性
var property = typeof(T).GetProperty(orderByExpression[i].propertyName);
//创建一个访问属性的表达式
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
var orderByExp = Expression.Lambda(propertyAccess, parameter); string OrderName = orderByExpression[i].IsDESC ? "OrderByDescending" : "OrderBy"; MethodCallExpression resultExp = Expression.Call(typeof(Queryable), OrderName, new Type[] { typeof(T), property.PropertyType }, query.Expression, Expression.Quote(orderByExp));
query = query.Provider.CreateQuery<T>(resultExp);
}
} total = query.Count();
return query.Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}

以上代码生成的sql语句使用SQL Server Profiler 查看时发现在 Order By 只显示一个排序字段,而且是最一个排序字段,应该是被覆盖了,修改一下:

  /// <summary>
/// 根据条件获取多个实体
/// </summary>
/// <param name="condition"></param>
/// <returns></returns>
public IList<T> GetAllEntity(Expression<Func<T, bool>> condition, int pageIndex, int pageSize, out long total, params OrderModelField[] orderByExpression)
{
//条件过滤
var query = this.QQYALIEntities.Set<T>().Where(condition); //创建表达式变量参数
var parameter = Expression.Parameter(typeof(T), "o"); if (orderByExpression != null && orderByExpression.Length > )
{
for (int i = ; i < orderByExpression.Length; i++)
{
//根据属性名获取属性
var property = typeof(T).GetProperty(orderByExpression[i].propertyName);
//创建一个访问属性的表达式
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
var orderByExp = Expression.Lambda(propertyAccess, parameter); string OrderName = "";
if (i > )
{
OrderName = orderByExpression[i].IsDESC ? "ThenByDescending" : "ThenBy";
}
else
OrderName = orderByExpression[i].IsDESC ? "OrderByDescending" : "OrderBy"; MethodCallExpression resultExp = Expression.Call(typeof(Queryable), OrderName, new Type[] { typeof(T), property.PropertyType }, query.Expression, Expression.Quote(orderByExp)); query = query.Provider.CreateQuery<T>(resultExp);
}
} total = query.Count();
return query.Skip((pageIndex - ) * pageSize).Take(pageSize).ToList();
}

判断如果是第一个排序条件时 使用OrderBy进行排序 其它几条使用ThenBy进行排序  ,这样就不会发生覆盖的现象

用 ThenBy() 才能記住原本排序的值,然後再排其他欄位

最新文章

  1. Entity Framework 6 Recipes 2nd Edition(13-10)译 -&gt; 显式创建代理
  2. 比较ID和Name
  3. Hibernate一对多(注解)
  4. 网站添加数据出错,原来是MS SQL Server2008日志文件占据空间过大导致的
  5. codevs1958 刺激
  6. java判断乱码
  7. jMeter 监控cpu、内存
  8. 定时组件quartz系列&lt;二&gt;quartz的原理
  9. Linux man命令数字含义
  10. java解析属性文件
  11. jQuery CSS 添加/删除类名
  12. oracle如何获取当年第一月,如今年是2015年,则需获取 201501
  13. hdu 4686 Arc of Dream(矩阵快速幂乘法)
  14. Codeforces Round #256 (Div. 2/C)/Codeforces448C_Painting Fence(分治)
  15. 淘特房产CMS系统 7.5
  16. (贪心) nyoj1036-非洲小孩
  17. C# test
  18. SSM商城项目(八)
  19. 震惊!1MB == 1000KB??
  20. java中的数据加密5 数字证书

热门文章

  1. mongodb地理位置索引
  2. Redis学习手册(管线)
  3. TRUNCATE TABLE 与 DELETE table 区别
  4. mydumper工作原理, seconds_behind_master的陷阱和pt-heartbeat (102)
  5. C++ ORM ODB 入门介绍(一)
  6. 开启、关闭数据库mysql
  7. Topself
  8. wamp配置虚拟主机
  9. ionic(一) build你的第一个android apk
  10. jquery - ul li click 无响应