首页 > 代码库 > Linq To Entity 查询条件扩展
Linq To Entity 查询条件扩展
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Linq.Expressions; 5 using System.Web; 6 7 namespace Test 8 { 9 /// <summary> 10 /// 统一ParameterExpression 11 /// </summary> 12 public class ParameterReplacer : ExpressionVisitor 13 { 14 public ParameterReplacer(ParameterExpression paramExpr) 15 { 16 ParameterExpression = paramExpr; 17 } 18 19 public ParameterExpression ParameterExpression { get; private set; } 20 21 public Expression Replace(Expression expr) 22 { 23 return Visit(expr); 24 } 25 26 protected override Expression VisitParameter(ParameterExpression p) 27 { 28 return ParameterExpression; 29 } 30 } 31 /// <summary> 32 /// Predicate扩展 33 /// </summary> 34 public static class PredicateExtensionses 35 { 36 /// <summary> 37 /// 38 /// </summary> 39 /// <typeparam name="T"></typeparam> 40 /// <returns></returns> 41 public static Expression<Func<T, bool>> True<T>() { return f => true; } 42 /// <summary> 43 /// 44 /// </summary> 45 /// <typeparam name="T"></typeparam> 46 /// <returns></returns> 47 public static Expression<Func<T, bool>> False<T>() { return f => false; } 48 /// <summary> 49 /// 50 /// </summary> 51 /// <typeparam name="T"></typeparam> 52 /// <param name="expLeft"></param> 53 /// <param name="expRight"></param> 54 /// <returns></returns> 55 public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expLeft, Expression<Func<T, bool>> expRight) 56 { 57 var candidateExpr = Expression.Parameter(typeof(T), "candidate"); 58 var parameterReplacer = new ParameterReplacer(candidateExpr); 59 60 var left = parameterReplacer.Replace(expLeft.Body); 61 var right = parameterReplacer.Replace(expRight.Body); 62 var body = Expression.And(left, right); 63 64 return Expression.Lambda<Func<T, bool>>(body, candidateExpr); 65 } 66 /// <summary> 67 /// 68 /// </summary> 69 /// <typeparam name="T"></typeparam> 70 /// <param name="expLeft"></param> 71 /// <param name="expRight"></param> 72 /// <returns></returns> 73 public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expLeft, Expression<Func<T, bool>> expRight) 74 { 75 var candidateExpr = Expression.Parameter(typeof(T), "candidate"); 76 var parameterReplacer = new ParameterReplacer(candidateExpr); 77 78 var left = parameterReplacer.Replace(expLeft.Body); 79 var right = parameterReplacer.Replace(expRight.Body); 80 var body = Expression.Or(left, right); 81 82 return Expression.Lambda<Func<T, bool>>(body, candidateExpr); 83 } 84 } 85 /// <summary> 86 /// Queryable扩展 87 /// </summary> 88 public static class QueryableExtensions 89 { 90 /// <summary> 91 /// 92 /// </summary> 93 /// <typeparam name="T"></typeparam> 94 /// <param name="queryable"></param> 95 /// <param name="propertyName"></param> 96 /// <returns></returns> 97 public static IQueryable<T> OrderBy<T>(this IQueryable<T> queryable, string propertyName) 98 { 99 return OrderBy(queryable, propertyName, false);100 }101 /// <summary>102 /// OrderBy103 /// </summary>104 /// <typeparam name="T">实体</typeparam>105 /// <param name="queryable">条件</param>106 /// <param name="propertyName">属性名称</param>107 /// <param name="desc">是否降序</param>108 /// <returns></returns>109 public static IQueryable<T> OrderBy<T>(this IQueryable<T> queryable, string propertyName, bool desc)110 {111 var param = Expression.Parameter(typeof(T));112 var body = Expression.Property(param, propertyName);113 dynamic keySelector = Expression.Lambda(body, param);114 return desc ? Queryable.OrderByDescending(queryable, keySelector) : Queryable.OrderBy(queryable, keySelector);115 }116 }117 }
Linq To Entity 查询条件扩展
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。