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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:54:04