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://www.cnblogs.com/liaote/p/15411880.html

 

      最后統一成 

 

   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<Result>() 理解如下
      
 PredicateBuilder中還有很多不只是new 也有PredicateBuilder.True
                                        PredicateBuilder.Or 等可以自己嘗試
//<result>改成自己集合或者數組的實體類名 ,只要命名和需要篩選的名字一致就可以

//當然也可以直接給集合或者數組進行篩選判斷
 var express = PredicateBuilder.New<string>()
 And(x => x.Contains(filter.Name));
//然后就可以使用了 List<string> 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://www.cnblogs.com/liaote/p/15411880.html

 

希望上述能幫到你


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM