欢迎来到代码驿站!

.NET代码

当前位置:首页 > 软件编程 > .NET代码

C#条件拼接Expression<Func<T, bool>>的使用

时间:2023-01-22 11:44:55|栏目:.NET代码|点击:

使用代码

特别注意 :拼接条件时,所使用到的条件strID,strBir必须是独立的

var predicate = PredicateBuilder.GetTrue<Student>();
predicate = predicate.And(it => it.id.ToString().Contains(strID));
predicate = predicate.And(it => it.Birthday.ToString().Contains(strBir));
predicate = predicate.And(it => it.Sex.ToString().Contains(strSex));
predicate = predicate.And(it => it.Age == 20);
var lst = db.Queryable<Student>.Where(predicate).ToList();

工具类

using System;
using System.Linq.Expressions;

namespace WindowsFormsApp1.Tools
{
    public static class PredicateBuilder
    {
        public static Expression<Func<T, bool>> GetTrue<T>() { return f => true; }
        public static Expression<Func<T, bool>> GetFalse<T>() { return f => false; }

        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 leftVisitor = new ReplaceExpressionVisitor(expr1.Parameters[0], parameter);
            var left = leftVisitor.Visit(expr1.Body);

            var rightVisitor = new ReplaceExpressionVisitor(expr2.Parameters[0], parameter);
            var right = rightVisitor.Visit(expr2.Body);

            return Expression.Lambda<Func<T, bool>>(
                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);
            }
        }
    }
}

上一篇:.Net Core部署Docker容器

栏    目:.NET代码

下一篇:详解C#中检查null的语法糖

本文标题:C#条件拼接Expression<Func<T, bool>>的使用

本文地址:http://www.codeinn.net/misctech/224216.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有