zoukankan      html  css  js  c++  java
  • linq 动态拼接where条件 类似 T_SQL And Or

    废话不多说,直接上代码  复制可

     1    internal class NewExpressionVisitor : ExpressionVisitor
     2     {
     3         public ParameterExpression _NewParameter { get; private set; }
     4         public NewExpressionVisitor(ParameterExpression param)
     5         {
     6             this._NewParameter = param;
     7         }
     8         public Expression Replace(Expression exp)
     9         {
    10             return this.Visit(exp);
    11         }
    12         protected override Expression VisitParameter(ParameterExpression node)
    13         {
    14             return this._NewParameter;
    15         }
    16     }
    17     public static class ExpressionExt
    18     {
    19         /// <summary>
    20         /// 合并表达式 expr1 AND expr2
    21         /// </summary>
    22         /// <typeparam name="T"></typeparam>
    23         /// <param name="expr1"></param>
    24         /// <param name="expr2"></param>
    25         /// <returns></returns>
    26         public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
    27         {
    28             if (expr1 == null)
    29                 return expr2;
    30             else if (expr2 == null)
    31                 return expr1;
    32 
    33             //return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(expr1.Body, expr2.Body), expr1.Parameters);
    34             ParameterExpression newParameter = Expression.Parameter(typeof(T), "c");
    35             NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter);
    36 
    37             var left = visitor.Replace(expr1.Body);
    38             var right = visitor.Replace(expr2.Body);
    39             var body = Expression.And(left, right);
    40             return Expression.Lambda<Func<T, bool>>(body, newParameter);
    41 
    42         }
    43         /// <summary>
    44         /// 合并表达式 expr1 or expr2
    45         /// </summary>
    46         /// <typeparam name="T"></typeparam>
    47         /// <param name="expr1"></param>
    48         /// <param name="expr2"></param>
    49         /// <returns></returns>
    50         public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
    51         {
    52             if (expr1 == null)
    53                 return expr2;
    54             else if (expr2 == null)
    55                 return expr1;
    56 
    57             ParameterExpression newParameter = Expression.Parameter(typeof(T), "c");
    58             NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter);
    59 
    60             var left = visitor.Replace(expr1.Body);
    61             var right = visitor.Replace(expr2.Body);
    62             var body = Expression.Or(left, right);
    63             return Expression.Lambda<Func<T, bool>>(body, newParameter);
    64         }
    65         public static Expression<Func<T, bool>> Not<T>(this Expression<Func<T, bool>> expr)
    66         {
    67             if (expr == null)
    68                 return null;
    69 
    70             var candidateExpr = expr.Parameters[0];
    71             var body = Expression.Not(expr.Body);
    72 
    73             return Expression.Lambda<Func<T, bool>>(body, candidateExpr);
    74         }
    75     }
    View Code

    调用时

    express= express.And(a => ids.Contains(id));

    express= express.Or(a => ids.Contains(id));

  • 相关阅读:
    「七天自制PHP框架」第四天:模型关联
    「七天自制PHP框架」第三天:PHP实现的设计模式
    「七天自制PHP框架」第二天:模型与数据库
    一个例子简要说明include和require的区别
    解读Laravel,看PHP如何实现Facade?
    Laravel是怎么实现autoload的?
    Laravel表单提交
    Laravel的console使用方法
    PHP控制反转(IOC)和依赖注入(DI)
    PHP解耦的三重境界(浅谈服务容器)
  • 原文地址:https://www.cnblogs.com/jcdd-4041/p/10291988.html
Copyright © 2011-2022 走看看