LINQ技术问询:如何利用分组连接的数据关联子表?
扩展数据加载器查询方案
我来帮你捋清楚怎么扩展这个数据加载器的查询,先把关键信息整理好,再给出具体的实现思路:
一、核心表关系梳理
先把你给出的表关联关系明确列出来:
- title ↔ parcel:1:1 一对一关联,连接列
title.p_id = parcel.p_id - title ↔ transaction:1:多 一对多关联,连接列
title.title_no = transaction.new_title_no - transaction ↔ title:多:1 多对一关联,连接列
transaction.old_title_no = title.title_no
二、现有查询代码片段
你提供的现有查询基础逻辑如下(补全了部分省略内容):
From title In context.Title Join parcel In context.Parcel On title.p_id Equals parcel.p_id // 现有后续数据加载逻辑...
三、扩展查询的具体实现
因为这是数据加载器,核心目标是减少数据库往返次数,所以我们可以通过一次性关联所需表来实现,分两种常见场景给出方案:
场景1:加载每个title关联的所有交易记录
如果需要同时获取每个title对应的交易(以当前title作为new_title_no的交易),可以用分组连接或者EF导航属性的Include来实现:
方式1:分组连接(Group Join)
From title In context.Title Join parcel In context.Parcel On title.p_id Equals parcel.p_id // 分组关联transaction,避免重复数据 Group Join trans In context.Transaction On title.title_no Equals trans.new_title_no Into relatedTransactions Select new { TitleInfo = title, ParcelInfo = parcel, // 每个title对应的交易集合 Transactions = relatedTransactions }
方式2:EF导航属性Include(如果使用Entity Framework)
前提是你的Title实体已经配置了指向Transaction的导航属性(对应new_title_no关联):
context.Title .Include(t => t.Transactions) // 预加载关联的交易数据 .Join(context.Parcel, title => title.p_id, parcel => parcel.p_id, (title, parcel) => new { Title = title, Parcel = parcel, Transactions = title.Transactions })
场景2:同时加载交易对应的旧title信息
如果需要进一步获取交易记录关联的旧title(即transaction.old_title_no对应的title数据),可以通过多表连接一次性加载:
From title In context.Title Join parcel In context.Parcel On title.p_id Equals parcel.p_id // 关联当前title对应的交易 Join trans In context.Transaction On title.title_no Equals trans.new_title_no // 关联交易对应的旧title Join oldTitle In context.Title On trans.old_title_no Equals oldTitle.title_no Select new { CurrentTitle = title, Parcel = parcel, TransactionRecord = trans, OldTitleInfo = oldTitle }
这种方式可以一次性把所有关联数据拉取完成,彻底避免N+1查询问题。
内容的提问来源于stack exchange,提问作者Rolan
相关产品推荐
相关产品推荐

