C#是否應(yīng)該限制鏈?zhǔn)街剌d的設(shè)計模式?
知乎網(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ā)跳槽?
點 分 享
點 收 藏
點 點 贊
點在看
