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);
                }
            }
    
        }
  • 相关阅读:
    Vue axios 使用记录
    Vue CLI 项目创建
    Vue中的事件修饰符。
    js 中控制打印方向横向还是纵向。
    element ui 列表中删除只能删除最后一项
    文件上传formData上传之前查看对象里的值
    GridControl_gridView 单元格内容换行(wrap)
    SqlTest(2013-07-10)
    printPreviewControl1 打印预览
    避免button处理事件过程中 点击按钮触发事件的方法
  • 原文地址:https://www.cnblogs.com/rengke2002/p/13047385.html
Copyright © 2011-2022 走看看