在Entity Framework中如果不設定為Lazy Loading Enable=true,勢必要自己處理關聯資料的載入,如:用Load或Include的,但因為Include的參數是用string,個人很討厭沒有IntelliSense,且用String改了TableName後,工具不易找到錯誤,所以小弟我寫一個Extension Method來擴展。
1 2 3 4 5 6 7 | //原弱型別的寫法 AdventureWorksLT2008R2Entities context = new AdventureWorksLT2008R2Entities(); var customer = context.Customer.Include( "SalesOrderHeader" ).ToList(); //擴展的強型別寫法 AdventureWorksLT2008R2Entities context = new AdventureWorksLT2008R2Entities(); var customer = context.Customer.Include(x => x.SalesOrderHeader).ToList(); |
NOTE:
這個方法暫時不適用Collection後又在關聯,如上一個例子SalesOrderHeader是Collection,無法這樣下x.SalesOrderHeader.SalesOrderDetail,為什麼是暫時,因為小弟還沒想出好的寫法,用x.SalesOrderHeader[0].SalesOrderDetail或x.SalesOrderHeader.First().SalesOrderDetail嗎,感覺挺醜的。
Source Code
1 2 3 4 5 6 7 | public static IQueryable<T> Include<T>( this ObjectSet<T> source, Expression<Func<T, object >> path) where T : class { //偷吃步的作法,如:Expression為x=>x.Customer.CustomerAddress,ToString後直接從第一個.分割,取後面的Customer.CustomerAddress string spath = path.Body.ToString(); spath = spath.Substring(spath.IndexOf( '.' ) + 1); return source.Include(spath); } |
上面的Code比較偷懶,應該要分析一下Expression比較正統
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public static IQueryable<T> Include<T>( this ObjectSet<T> source, Expression<Func<T, object >> path) where T : class { StringBuilder pathBuilder = new StringBuilder(); MemberExpression pro = path.Body as MemberExpression; while (pro != null ) { //Exprssion有點像鏈結串列,從Statemant的後方往前連結,如: x=> x.Customer.CustomerAddress //path.Body是CustomerAddress //CustomerAddress的Expression是Customer //Customer的Expression是x pathBuilder.Insert(0, "." + pro.Member.Name); pro = pro.Expression as MemberExpression; } return source.Include(pathBuilder.ToString(1, pathBuilder.Length-1)); } |
NOTE:
我沒有做錯誤檢查,想說有錯Entity Framework也會丟Exception,自己就不多事了。
圖1 Model關聯圖
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?