1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 5071字,需瀏覽 11分鐘

         ·

        2023-08-27 01:31

        知乎網(wǎng)友問(wèn)

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

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

         

        我的回答

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

         

        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(); //此代碼來(lái)自SqlSugar ORM
              
            

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


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

        2、易編寫和可擴(kuò)展

        如果不用鏈?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)
              
            

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

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

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

        一般95%參數(shù)的順序沒(méi)有要求的時(shí)候可以用鏈?zhǔn)街?,意就是說(shuō)

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

         

        總結(jié):

        使用鏈?zhǔn)绞且挥羞h(yuǎn)見(jiàn)的設(shè)計(jì)方案,你要考慮到未來(lái)需求無(wú)限增長(zhǎng)的情況

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

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

        EF Core8近期才免強(qiáng)支持,整整晚了五年

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

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

              
                
                  //分頁(yè)更新除低內(nèi)存,可以自動(dòng)調(diào)節(jié)最佳性能
                
              
              
                db.Updateable(List<實(shí)體>).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();
              
              
              
                //無(wú)實(shí)體更新
              
              
                db.Updateable<object>()
              
              
                                .AS("Order")
              
              
                                .SetColumns("name", 1)
              
              
                                .Where("id=1").ExecuteCommand();
              
              
              
                //導(dǎo)航更新,可以方便的指定更新層級(jí)
              
              
                 db.UpdateNav(list)
              
              
                  .Include(z1 => z1.Books)
              
              
                  .ThenInclude(z1 => z1.RoomList)
              
              
                  .ExecuteCommand();
              
              
              
                //分表更新
              
              
                db.Insertable(data).SplitTable().ExecuteCommand();
              
              
                //分表在分頁(yè)更新
              
              
                db.Insertable(data).SplitTable().PageSize(1000).ExecuteCommand();
              
            

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

        作者:孫凱旋


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


            

        關(guān)注公眾號(hào)DotNet開(kāi)發(fā)跳槽?    

              

        點(diǎn)

        41d83aa4071544470fe9e6a500956dd4.webp

        點(diǎn)

        e74f769bbbd4fdcc9f5301a554409073.webp

        點(diǎn) 點(diǎn)

        66b23591d607291a80382a7723b4b5db.webp

        點(diǎn)在看

        瀏覽 76
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            天天添天天操 | 亚洲精品无码乱码成人91 | 国产一级a毛一级a看免费人交 | 开心激情色色网 | blacked性猛交monika | 我被老师在办公室躁得好爽 | 免费在线观看黄色小说 | 精品中文字幕在线观看 | 日韩人妻无码一区二区三区视频 | 体育生被强到爽哭高h |