Entity Framework两表左连接时如何筛选左表中右表不存在的行
实现方案
你可以通过两种常用的Linq写法实现需求,两种写法都会被EF转换为高效的SQL查询,不会全量加载表数据到内存。
方案1:左连接筛选(符合你提到的实现思路)
直接对两张表做左外连接,筛选连接后表B为空的记录即可:
// 假设dbContext是你的数据库上下文实例,Loans和LoanApproves是上下文中对应的DbSet var query = from loan in dbContext.Loans join approve in dbContext.LoanApproves on loan.Id equals approve.LoanId into joinGroup from approve in joinGroup.DefaultIfEmpty() where approve == null select new { LoanId = loan.Id, Amount = loan.FundingAmount }; // 执行查询获取结果 var result = query.ToList();
方案2:Not Contains写法(代码更简洁易读)
如果不需要关联表B的其他字段,这种写法可读性更高:
// 该子查询会被EF整合到最终SQL中,不会单独执行查询 var existLoanIds = dbContext.LoanApproves.Select(a => a.LoanId); var result = dbContext.Loans .Where(l => !existLoanIds.Contains(l.Id)) .Select(l => new { LoanId = l.Id, Amount = l.FundingAmount }) .ToList();
两种写法最终生成的SQL性能差异极小,都会走数据库索引,你可以根据自己的编码习惯选择。
内容的提问来源于stack exchange,提问作者Fazla Elahi Md Jubayer
相关产品推荐
相关产品推荐

