Linq-To-SQL:高效加载选中订单的OrdItems及关联Items
最优解决方案:使用LoadProperty+DataLoadOptions按需加载关联数据
针对你的场景,最简单高效的方式是利用Linq to SQL的LoadProperty方法,配合DataLoadOptions一次性加载选中订单的OrdItems集合及其关联的Items属性,具体步骤如下:
- 确保当前的
DataContext实例仍处于可用状态(未被释放); - 创建
DataLoadOptions对象,配置预加载OrdItems关联的Items属性:Dim loadOptions As New DataLoadOptions() ' 指定加载OrdItems时同时加载对应的Items loadOptions.LoadWith(Of OrdItems)(Function(oi) oi.Items) myDataContext.LoadOptions = loadOptions - 调用
LoadProperty方法加载选中订单的OrdItems集合,此时关联的Items会被自动预加载:' order是用户选中的订单实体 myDataContext.LoadProperty(order, Function(o) o.OrdItems)
为什么这个方法更优:
- 无需重新查询
Orders表,避免了重复查询的开销; - 一次性完成
OrdItems和关联Items的加载,不用手动遍历每个OrdItem去触发延迟加载; - 不会提前加载所有订单的关联数据,完全按需加载选中的单个订单详情。
如果原DataContext已经被释放(比如跨页面/表单导致上下文销毁),则退而求其次,用新的DataContext只查询选中的订单ID,同时配置DataLoadOptions预加载关联数据,这种方式虽然会查询一次Orders表,但只针对单个订单,开销极低:
Using newDC As New MyDataContext() Dim loadOptions As New DataLoadOptions() loadOptions.LoadWith(Of Orders)(Function(o) o.OrdItems) loadOptions.LoadWith(Of OrdItems)(Function(oi) oi.Items) newDC.LoadOptions = loadOptions ' 只查询选中的订单ID Dim targetOrder = newDC.Orders.Single(Function(o) o.OrderID = selectedOrderID) ' 此时targetOrder的OrdItems和每个OrdItem的Items都已加载完成 End Using
这种方式虽然会查询一次Orders表,但因为是单条记录查询,加上关联数据的连接查询,整体性能开销远低于多次延迟加载的请求。
内容的提问来源于stack exchange,提问作者Disti
相关产品推荐
相关产品推荐

