zoukankan      html  css  js  c++  java
  • asp.net core Expression<Func<T, bool>> 类添加多个条件参数

    1.直接上代码吧:注意使用的地方

     expression= expression.And(p => p.Name.Equals("123"));*少了前面的的赋值只会有最后一个条件一定注意
     static void Main(string[] args)
            {
                Expression<Func<Template, bool>> expression = null;
                 expression = p => p.AAA.Equals(123);
                //expression.And(p => p.AAA==123);
                expression= expression.And(p => p.Name.Equals("123"));
                expression = expression.Or(p=>p.Age==18);
                Console.WriteLine("Hello World!");
            }
    public class Template
        {
            public int AAA { get; set; }
            public string Name { get; set; }
    
            public int Age { get; set; }
        }
    public static class ExpressionBuilder
        {
            public static Expression<Func<T, bool>> And<T>(
                this Expression<Func<T, bool>> first,
                Expression<Func<T, bool>> second)
            {
                return first.AndAlso<T>(second, Expression.AndAlso);
            }
    
            public static Expression<Func<T, bool>> Or<T>(
                this Expression<Func<T, bool>> first,
                Expression<Func<T, bool>> second)
            {
                return first.AndAlso<T>(second, Expression.OrElse);
            }
    
            private static Expression<Func<T, bool>> AndAlso<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2, Func<Expression, Expression, BinaryExpression> func)
            {
                var parameter = Expression.Parameter(typeof(T));
                //var parameter2 = Expression.Parameter(typeof(T));
                var ddd= expr1.Parameters;
                var leftVisitor = new ReplaceExpressionVisitor(expr1.Parameters[0], parameter);
                var left = leftVisitor.Visit(expr1.Body);
    
                var rightVisitor = new ReplaceExpressionVisitor(expr2.Parameters[0], parameter);//不是用.Parameters[0]结果是不对的
                var right = rightVisitor.Visit(expr2.Body);
    
                 return Expression.Lambda<Func<T, bool>>(func(left, right), parameter);
                 ///return Expression.Lambda(func(left, right), parameter);
            }
    
            private class ReplaceExpressionVisitor
                : ExpressionVisitor
            {
                private readonly Expression _oldValue;
                private readonly Expression _newValue;
    
                public ReplaceExpressionVisitor(Expression oldValue, Expression newValue)
                {
                    _oldValue = oldValue;
                    _newValue = newValue;
                }
    
                public override Expression Visit(Expression node)
                {
                    if (node == _oldValue)
                       return _newValue;
                    return base.Visit(node);
                }
            }
    
        }
  • 相关阅读:
    从ReentrantLock的实现看AQS的原理及应用
    Java 守护线程
    js静态文件编辑器显示操作,但网页显示中文乱码 解决方案
    springmvc 4.3版本集成 Caffeine缓存系统
    chrome浏览器如何设置黑色背景
    电脑型号19 1200 固态SSD
    电脑型号18 1200 固态SSD
    geohash st_distance st_distance_sphere 关系
    Git自动输入账户名密码。明文及SSH私钥2种方式
    一步快速获取 iOS 设备的 UDID
  • 原文地址:https://www.cnblogs.com/rengke2002/p/13047385.html
Copyright © 2011-2022 走看看