EF Core左连接实现:获取PriorNavPositions表全量记录的技术问询
你的现有查询中,第一个join是内连接,这会过滤掉PriorNavPositions中没有匹配SourceInvestorAllocations的记录。要保留PriorNavPositions的所有记录,需要将第一个连接也改为左连接,同时处理后续连接中可能出现的空引用问题。
修改后的查询代码
var query = (from pn in PriorNavPositions // 将第一个内连接改为左连接 join sa in SourceDataset.SourceInvestorAllocations on new { SourceDatasetId = pn.SourceDatasetId, Iqid = pn.SubscriberFiid, ShareIndex = pn.ShareIndex } equals new { SourceDatasetId = sa.SourceDataset.Id, Iqid = sa.IqId, ShareIndex = sa.EFrontInteger } into saj from sa in saj.DefaultIfEmpty() // 第二个左连接保留,处理sa为null的情况避免空引用 join ea in EfrontNavDataset.EfrontNavInvestorAllocations on new { SourceDatasetId = sa?.SourceDataset.Id ?? pn.SourceDatasetId, Iqid = sa?.IqId ?? pn.SubscriberFiid, ShareIndex = sa?.EFrontInteger ?? pn.ShareIndex } equals new { SourceDatasetId = ea.EfrontNavDataset.SourceDatasetId, Iqid = ea.IqId, ShareIndex = ea.ShareIndex } into pnj from ea in pnj.DefaultIfEmpty() select new { sa, ea, pn });
关键修改说明
- 第一个连接新增
into saj和from sa in saj.DefaultIfEmpty(),将内连接转为左连接,确保PriorNavPositions的所有记录都被保留,即使没有匹配的SourceInvestorAllocations记录(此时sa会为null)。 - 第二个连接的条件中,使用
sa?.xxx ?? pn.xxx的空合并运算符,当sa为null时,回退使用pn的对应字段值进行匹配,避免空引用异常,同时保证左连接的逻辑正确性。
如果你的EF版本不支持空传播运算符,也可以用条件判断替代:
join ea in EfrontNavDataset.EfrontNavInvestorAllocations on new { SourceDatasetId = sa != null ? sa.SourceDataset.Id : pn.SourceDatasetId, Iqid = sa != null ? sa.IqId : pn.SubscriberFiid, ShareIndex = sa != null ? sa.EFrontInteger : pn.ShareIndex } equals new { SourceDatasetId = ea.EfrontNavDataset.SourceDatasetId, Iqid = ea.IqId, ShareIndex = ea.ShareIndex } into pnj
内容的提问来源于stack exchange,提问作者Sarfaraz Khan
相关产品推荐
相关产品推荐

