You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linq-To-SQL:高效加载选中订单的OrdItems及关联Items

最优解决方案:使用LoadProperty+DataLoadOptions按需加载关联数据

针对你的场景,最简单高效的方式是利用Linq to SQL的LoadProperty方法,配合DataLoadOptions一次性加载选中订单的OrdItems集合及其关联的Items属性,具体步骤如下:

  1. 确保当前的DataContext实例仍处于可用状态(未被释放);
  2. 创建DataLoadOptions对象,配置预加载OrdItems关联的Items属性:
    Dim loadOptions As New DataLoadOptions()
    ' 指定加载OrdItems时同时加载对应的Items
    loadOptions.LoadWith(Of OrdItems)(Function(oi) oi.Items)
    myDataContext.LoadOptions = loadOptions
    
  3. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 09:47:37