<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          C#是否應(yīng)該限制鏈?zhǔn)街剌d的設(shè)計模式?

          共 5071字,需瀏覽 11分鐘

           ·

          2023-08-27 01:31

          知乎網(wǎng)友問

          鏈?zhǔn)街剌d是我自己創(chuàng)造的一個詞,意思是方法A里處理一下參數(shù),return另一個方法A,第二個方法A里處理一下參數(shù)調(diào)第三個方法A,就這樣無限循環(huán)下去直到調(diào)到真正能出結(jié)果的方法A。

          本人學(xué)藝不精,偶然進行C#開發(fā),感覺看代碼要吐。比如看到某處調(diào)用方法A,除非有某個特征顯眼的參數(shù),否則根本不知道調(diào)的方法A是哪個,而且代碼里也不是按照鏈的順序?qū)懙摹?/span>

           

          我的回答

          你說的鏈?zhǔn)街剌d是重載是有必須要的,準(zhǔn)確說應(yīng)該叫構(gòu)造者設(shè)計模式。

           

          1、代碼的可閱讀性

          一眼看懂是什么意思,并且能看出生成的SQL是什么樣的

                
                  var list = db.Queryable<Student>()
                
                
                            .GroupBy(it => it.Name) 
                
                
                            .Where(it=>it.Id>0)
                
                
                            .Select(it => new {
                
                
                                         idAvg = SqlFunc.AggregateAvg(it.Id),
                
                
                                         count = SqlFunc.AggregateCount(it.Id), 
                
                
                                          name = it.Name })
                
                
                            .ToList(); //此代碼來自SqlSugar ORM
                
              

          下面這么寫可能就看不懂是什么意思,根看看不出哪個是條件哪個是分組


                
                  db.Query(it=>it.Name,
                
                
                               it.Id>0,
                
                
                               it => new {
                
                
                                            idAvg = SqlFunc.AggregateAvg(it.Id),
                
                
                                            count = SqlFunc.AggregateCount(it.Id), 
                
                
                                             name = it.Name })//看不懂什么意思
                
              

          2、易編寫和可擴展

          如果不用鏈?zhǔn)街剌d下面參數(shù)越寫越多,你讓用的人怎么去調(diào),光看這些重載眼睛都要看花,并且封裝方法的人也不舒服,寫的代碼的人工作量也大大家都不舒服。


                
                  db.Query(group,where,select,orderby,page)
                
                
                  db.Query(group,where,select,orderby)
                
                
                  db.Query(group,where,select)
                
                
                  db.Query(group,where)
                
                
                  db.Query(group)
                
              

          上面的還能接受下面的就破防了,因為鏈?zhǔn)街剌d函數(shù)的可以重復(fù)使用

                
                  //用鏈?zhǔn)街剌d可以有多次使用同一個參數(shù)
                
                
                  .OrderBy(it=>it.Id)
                
                
                  .OrderBy(it=>it.Name)
                
                
                  .OrderBy(it=>it.Price) //那你下面的代碼怎么改沒辦法改了吧哈哈 <br>db.Query(group1,group2,group3,where1,where2,where3,orderby1,Orderby2,Orderby3........)
                
                
                  
                    

          3、什么時候適合鏈?zhǔn)街剌d

          一般95%參數(shù)的順序沒有要求的時候可以用鏈?zhǔn)街兀饩褪钦f

          Where、OrderBy、Group這些函數(shù)的順序沒有要求的時候

           

          總結(jié):

          使用鏈?zhǔn)绞且挥羞h見的設(shè)計方案,你要考慮到未來需求無限增長的情況

          就拿EF Core來說只是查詢用了鏈?zhǔn)街剌d,插入、更新和刪除沒有使用鏈?zhǔn)街剌d

          這就導(dǎo)致他插入更新和刪除功能受到了嚴(yán)重的限制, 下面的功能SqlSugar五年前就有了

          EF Core8近期才免強支持,整整晚了五年

                
                  var result= db.Updateable<Student>()
                
                
                  .SetColumns(it => it.Num== it.Num+1)
                
                
                  .Where(it => it.Id == 1)
                
                
                  .ExecuteCommand();
                
              

          SqlSugar正因設(shè)計的長遠,使用了鏈?zhǔn)焦δ芟朐趺醇泳驮趺醇樱琒qlSuar在EF Core停滯的五年又加了很多功能 秀一下

                
                  
                    //分頁更新除低內(nèi)存,可以自動調(diào)節(jié)最佳性能
                  
                
                
                  db.Updateable(List<實體>).PageSize(1000).ExecuteCommand()
                
                
                
                  
                    //條件更新
                  
                
                
                  db.Updateable<Order>()
                
                
                                .SetColumnsIF(p!=null ,it => it.CreateTime == p.Value)
                
                
                                .SetColumnsIF(X!=null ,it => it.X== X)
                
                
                                .Where(it => it.Id == 11).ExecuteCommand();
                
                
                
                  
                    //聯(lián)表更新
                  
                
                
                  var t= db.Updateable<Order>()
                
                
                          .InnerJoin<Custom>((x, y) => x.CustomId == y.Id)
                
                
                            .SetColumns((x, y) => new Order() { Name = y.Name, Price = y.Id })
                
                
                            .Where((x, y) => x.Id == 1)
                
                
                            .ExecuteCommand();
                
                
                
                  //批量 字段+list[i].字段
                
                
                  db.Updateable(list)
                
                
                     PublicSetColumns(it => it.Price, "+") //set price=price+list[i].price
                
                
                     .ExecuteCommand();
                
                
                
                  //字典集合更新
                
                
                  var dtList = new List<Dictionary<string, object>>();
                
                
                  dtList.Add(dt);
                
                
                  dtList.Add(dt2);
                
                
                  var t666 = db.Updateable(dtList).AS("student").WhereColumns("id").ExecuteCommand();
                
                
                
                  //無實體更新
                
                
                  db.Updateable<object>()
                
                
                                  .AS("Order")
                
                
                                  .SetColumns("name", 1)
                
                
                                  .Where("id=1").ExecuteCommand();
                
                
                
                  //導(dǎo)航更新,可以方便的指定更新層級
                
                
                   db.UpdateNav(list)
                
                
                    .Include(z1 => z1.Books)
                
                
                    .ThenInclude(z1 => z1.RoomList)
                
                
                    .ExecuteCommand();
                
                
                
                  //分表更新
                
                
                  db.Insertable(data).SplitTable().ExecuteCommand();
                
                
                  //分表在分頁更新
                
                
                  db.Insertable(data).SplitTable().PageSize(1000).ExecuteCommand();
                
              

          出處: cnblogs.com/sunkaixuan/p/17655870.html

          作者:孫凱旋


          版權(quán)聲明:本文來源于網(wǎng)友收集或網(wǎng)友供稿,僅供學(xué)習(xí)交流之用,如果有侵權(quán),請轉(zhuǎn)告小編或者留言,本公眾號立即刪除。


              

          關(guān)注公眾號DotNet開發(fā)跳槽?    

                

          41d83aa4071544470fe9e6a500956dd4.webp

          e74f769bbbd4fdcc9f5301a554409073.webp

          66b23591d607291a80382a7723b4b5db.webp

          點在看

          瀏覽 76
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  无码视频免费在线播放 | 以前的午夜操一操 | 激情在线色婷婷 | 大香蕉久久视频 | 免费看无码一级A片在线播放男男 |