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

将关联TABLE_A与TABLE_B的SQL Server查询转换为C# LINQ Lambda查询

将SQL内连接查询转换为C# LINQ Lambda表达式

首先,你的原始SQL是一个隐式内连接,通过b.COL1 = a.COL3关联两个表。下面提供两种常见的LINQ Lambda实现方式,根据你的EF模型是否配置了导航属性来选择:


方式一:显式使用Join方法(无导航属性时适用)

如果你的实体模型没有配置TABLE_A到TABLE_B的导航属性,可以直接用LINQ的Join方法模拟SQL的内连接逻辑:

var queryResult = dbContext.TABLE_A
    .Join(
        dbContext.TABLE_B,
        a => a.COL3,          // TABLE_A的外键字段(关联TABLE_B的主键)
        b => b.COL1,          // TABLE_B的主键字段
        (a, b) => new         // 投影需要的字段(注意重命名避免COL2冲突)
        {
            COL1 = a.COL1,
            COL2_FromA = a.COL2,
            COL2_FromB = b.COL2
        }
    )
    .ToList(); // 执行查询并转为列表

说明:

  • Join方法的前两个参数是要连接的两个数据源(TABLE_A作为外层,TABLE_B作为内层)
  • 第三、四个参数分别指定两个表的关联键(外键→主键)
  • 最后一个参数是结果投影,用匿名类型封装需要返回的字段(如果需要返回自定义DTO类,替换new { ... }为new YourDtoClass { ... }即可)

方式二:使用导航属性(推荐,更简洁)

如果你的EF实体模型已经通过外键配置了导航属性(比如在TABLE_A类中添加了public TABLE_B TABLE_B { get; set; }属性),可以直接通过导航属性访问关联数据,代码更简洁:

var queryResult = dbContext.TABLE_A
    .Where(a => a.TABLE_B != null) // 可选:如果外键允许为空,过滤掉关联为空的记录
    .Select(a => new
    {
        COL1 = a.COL1,
        COL2_FromA = a.COL2,
        COL2_FromB = a.TABLE_B.COL2
    })
    .ToList();

说明:

  • EF会自动将导航属性的访问转换为SQL中的内连接查询,和原始SQL逻辑一致
  • 这种方式代码可读性更高,也更符合EF的使用习惯

注意事项:

  • 两种方式最终生成的SQL查询逻辑和你的原始SQL完全一致,都是内连接
  • 如果需要返回强类型对象而非匿名类型,只需将投影中的匿名类型替换为你的自定义数据传输对象(DTO)即可

内容的提问来源于stack exchange,提问作者Rouzbeh Zarandi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:48:43