asp.net core C#进行筛选、过滤、使用PredicateBuilder进行动态拼接lamdba表达式树并用作条件精准查询,模糊查询

在asp.net core、asp.net 中做where条件过滤筛选的时候写的长而繁琐不利于维护,用PredicateBuilder进行筛选、过滤、LInq配合Ef.core进行动态拼接lamdba表达式树并用作条件精准查询,模糊查询,加上Any和Contains进行进一步处理

在linq中各种条件表达式可能写的巨长而且过几天自己都看不懂了,这个可以用在各种地方,我举例一部分

在列表中一般都会有查询筛选这一角色
可以精准查询,模糊查询,未知类型查询,跨表查询等等

       public async Task<IActionResult> List(Model filter)
        {
          var express = PredicateBuilder.New<Result>() //这里Result是我们定义的实体类,必须与下面where条件的类型一致
         
            //简化为 where(id==filter.id)直接等于相当于精准查询
              .And(x => filter.Id == 0 || x.Id == filter.Id)

              //简化为where(id==filter.id and name==filter.name)输出的时候为where(id=1 and name='大帅逼')
              //contains是模糊查询 简化为 name link %大帅逼%
              .And(x => string.IsNullOrEmpty(filter.Name) || x.Name.Contains(filter.Name))
 
             //类似上述,深入查询也是可以模糊查找的, Any有点难度可以理解为foreach循环 foreach(var t Data){t.user}
              .And(x => x.Data.Any(t => t.User.Any(s => s.Content.Contains(filter.Content))))

              //当然字符串也可以精准查找数据
              .And(x => x.Title==filter.Title)
          
               //跨表查询或者说深入查询也可以精准查找
              .And(x => x.Data.Any(t => t.Title=filter.Title));

       //使用起来就是加载条件里面就可以了
          List<Result> ModelList=new List<Result>();
          ModelList.where(express);
       
       当我们使用EF的时候也是可以用的,其他方法也是可以用的
         var result=Query.where(express);
        }
        //当我们使用 efcore ,ling查询数据库的时候也可以用  这是缩写
        public virtual IQueryable<Result> Query<T>(Expression<Func<Result, bool>> predicate)
        {
            return DbContext.Set<Result>().Where(predicate);
        }
        
     如果需要EF这块知识的请点击下方链接

如果需要EF这块请点击:https://blog.csdn.net/weixin_45973327/article/details/120762923

最后统一成

   public async Task<IActionResult> List(Model filter)
        {
          var express = PredicateBuilder.New<Result>()
              .And(x => filter.Id == 0 || x.Id == filter.Id)
              .And(x => string.IsNullOrEmpty(filter.Name) || x.Name.Contains(filter.Name))
              .And(x => x.Data.Any(t => t.User.Any(s => s.Content.Contains(filter.Content))))
              .And(x => x.Title==filter.Title)
              .And(x => x.Data.Any(t => t.Title=filter.Title));

          List<Result> ModelList=new List<Result>();
          ModelList.where(express);

综上所述简化出来细说一条一条理解

var express = PredicateBuilder.New() 理解如下

PredicateBuilder中还有很多不只是new 也有PredicateBuilder.True
PredicateBuilder.Or 等可以自己尝试
改成自己集合或者数组的实体类名 ,只要命名和需要筛选的名字一致就可以

当然也可以直接给集合或者数组进行筛选判断
var express = PredicateBuilder.New()
And(x => x.Contains(filter.Name));
然后就可以使用了 List data.where(express)//例子

.And(x => filter.Id == 0 || x.Id == filter.Id)理解如下

使用了lamdba表达式来定义,x=>x.id 的意思是实例化一下当前类
然后就跟sql语句一样 id=id来判断

.And(x => x.Data.Any(t => t.Title=filter.Title))理解如下还有 Any和Contains的用法

Any的意思简化可以理解为
foreach(var x in Data)
{
return x.title==title
}

Contains可以理解为sql里面的模糊查询 例子:我是大帅逼服不服
where title link %大帅逼%
%是指模糊,前面的%放前面就是前面的要查,不加就不查,放后面就后面的也查同理
最后使用 最简单 list.where(express )

如果需要EF这块请点击:https://blog.csdn.net/weixin_45973327/article/details/120762923

希望上述能帮到你

  • 1
    点赞
  • 2
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页
评论

打赏作者

山空响不散

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值