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