动态拼接lambda

PredicateBuilder的UML类图
  public static class PredicateBuilder
    {
        public static Expression<Func<T, bool>> True<T>() { return f => true; }
        public static Expression<Func<T, bool>> False<T>() { return f => false; }
        public static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge)
        {
            var map = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f);
            var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body); 
            return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
        {
            return first.Compose(second, Expression.And);
        }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
        {
            return first.Compose(second, Expression.Or);
        }
    }
    public class ParameterRebinder : ExpressionVisitor
    {
        private readonly Dictionary<ParameterExpression, ParameterExpression> map;

        public ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map)
        {
            this.map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();
        }

        public static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp)
        {
            return new ParameterRebinder(map).Visit(exp);
        }

        protected override Expression VisitParameter(ParameterExpression p)
        {
            ParameterExpression replacement;
            if (map.TryGetValue(p, out replacement))
            {
                p = replacement;
            }
            return base.VisitParameter(p);
        }
    } 

测试代码:

   var condition = PredicateBuilder.True<policy>();
                condition=condition.And(p=>p.PolicyId==policyId);
                if (!string.IsNullOrEmpty(kindName))
                {
                    condition = condition.And(p => p.KindName.Contains(kindName) || p.KindName.StartsWith(kindName));
                }
                if (!string.IsNullOrEmpty(provisionName))
                {
                    condition = condition.And(p => p.ProvisionName.Contains(provisionName) || p.ProvisionName.StartsWith(provisionName));
                }
                if (itemKindNo > 0)
                {
                    condition = condition.And(p => p.ItemKindNo == itemKindNo);
                }
                var totalCount = _policyDetailRepository.GetList(condition).Count();
                var data= _policyDetailRepository.GetList(condition).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();


### 回答1: MybatisPlus是一款优秀的ORM框架,它提供了丰富的API,可以方便地进行动态SQL拼接。在使用MybatisPlus进行动态SQL拼接时,我们可以使用Wrapper类来构建查询条件,例如: ``` QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("name", "张三"); wrapper.gt("age", 18); wrapper.like("email", "@qq.com"); List<User> userList = userMapper.selectList(wrapper); ``` 在上面的代码中,我们使用QueryWrapper类来构建查询条件,eq方法表示等于,gt方法表示大于,like方法表示模糊查询。最后,我们调用selectList方法执行查询,并将结果封装成List<User>对象返回。 除了QueryWrapper类,MybatisPlus还提供了LambdaQueryWrapper类,它可以使用Lambda表达式来构建查询条件,例如: ``` LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>(); lambdaWrapper.eq(User::getName, "张三"); lambdaWrapper.gt(User::getAge, 18); lambdaWrapper.like(User::getEmail, "@qq.com"); List<User> userList = userMapper.selectList(lambdaWrapper); ``` 在上面的代码中,我们使用LambdaQueryWrapper类来构建查询条件,eq方法、gt方法、like方法都可以使用Lambda表达式来表示。最后,我们调用selectList方法执行查询,并将结果封装成List<User>对象返回。 总之,MybatisPlus提供了丰富的API,可以方便地进行动态SQL拼接,让我们的开发更加高效、便捷。 ### 回答2: MybatisPlus是Mybatis的增强插件,它的主要功能是通过一些简单的配置,减少Mybatis的样板代码,提高开发效率。其中最常用的功能之一是动态拼接SQL。 动态拼接SQL是MybatisPlus强大的特性之一,它可以根据不同的条件来动态组合SQL语句,以适应不同的业务需求。 MybatisPlus提供了多种方法来实现动态拼接SQL,最常用的方法是使用Wrapper。Wrapper是一个具有强大功能的接口,可以用于拼接SQL的各个部分,例如WHERE子句、AND/OR条件、ORDER BY子句等。 例如,我们需要查询一个学校中所有年龄大于20岁的学生,代码如下: ``` QueryWrapper<Student> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("school_id", 1001) .gt("age", 20); List<Student> studentList = studentMapper.selectList(queryWrapper); ``` 在这个例子中,我们使用了QueryWrapper来动态拼接SQL。首先我们创建了一个QueryWrapper对象,然后使用eq方法和gt方法来设置条件。 其中eq方法用于等值查询,它的参数是数据库表中的列名和要查询的值。gt方法用于大于查询,它的参数是数据库表中的列名和要查询的值。 最后,我们使用selectList方法执行该查询并返回结果。 除了上述方法,MybatisPlus还提供了LambdaQueryWrapper和UpdateWrapper等方法,用于更加方便的动态拼接SQL。这些方法可以帮助我们减少编写繁琐的SQL语句的时间和精力,从而提高开发效率。 ### 回答3: Mybatis-Plus是Mybatis的增强版,提供了更多的操作方法、注解等。动态拼接SQL是Mybatis-Plus非常强大的功能之一,允许我们在不写复杂SQL语句的情况下,根据不同的需求动态的生成SQL。 Mybatis-Plus的动态SQL可以分为两种:XML动态SQL和注解动态SQL。 XML动态SQL可以使用if、choose、when、otherwise、foreach等建立一条动态的SQL语句,例如: ```xml <select id="getUserListByCondition" resultMap="resultMap"> SELECT * FROM user <where> <if test="name!=null and name!=''"> and name like concat('%',#{name},'%') </if> <if test="age!=null and age!=0"> and age = #{age} </if> <if test="sex!=null and sex!=''"> and sex = #{sex} </if> </where> </select> ``` 在这个例子中,动态拼接了一个where子句,如果参数中包含name、age、sex属性的话,会将相应的条件拼接到SQL语句中,达到动态的效果。 注解动态SQL可以使用@SelectProvider、@UpdateProvider、@DeleteProvider、@InsertProvider注解指定提供动态SQL实现的类,并指定类中的方法。例如: ```java @Mapper public interface UserMapper extends BaseMapper<User> { @SelectProvider(type = UserSqlProvider.class, method = "getUserListByCondition") List<User> getUserListByCondition(UserCondition userCondition); } public class UserSqlProvider { public String getUserListByCondition(UserCondition userCondition){ return new SQL() {{ SELECT("*"); FROM("user"); if (userCondition.getName() != null && !userCondition.getName().isEmpty()) { WHERE("name like concat('%',#{name},'%')"); } if (userCondition.getAge() != null && userCondition.getAge() != 0) { WHERE("age = #{age}"); } if (userCondition.getSex() != null && !userCondition.getSex().isEmpty()) { WHERE("sex = #{sex}"); } }}.toString(); } } ``` 在这个例子中,定义了一个UserSqlProvider类,其中getUserListByCondition方法返回一个动态SQL语句。使用注解@SelectProvider指定了提供动态SQL的类和方法,使其成为动态SQL语句的提供者。 总之,动态拼接SQL是Mybatis-Plus的重要功能之一,可以使我们免去写复杂SQL的烦恼,使开发更加快速高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值