将关联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
相关产品推荐
相关产品推荐

