如何使用Lambda语法编写On子句含多条件的LinQ Join查询
多条件LinQ Join查询的Lambda实现方法
这类多条件关联查询完全可以用Lambda语法实现,根据关联条件的类型分为两种常见实现方案:
场景1:仅包含多个等值关联条件
如果所有关联条件都是键相等的匹配规则,可以直接使用Join方法,通过匿名类封装多个关联键实现匹配,注意左右表返回的匿名类的属性名、属性顺序、属性类型必须完全一致,否则会匹配失败。
示例代码:
// 示例实体类 public class Student { public int Id { get; set; } public string Name { get; set; } public int GradeId { get; set; } public int ClassId { get; set; } } public class Score { public int StudentId { get; set; } public int GradeId { get; set; } public int ClassId { get; set; } public int MathScore { get; set; } } // 多等值键关联Lambda写法 var queryResult = students.Join(scores, // 左表关联键:封装为匿名类 s => new { StudentId = s.Id, s.GradeId, s.ClassId }, // 右表关联键:匿名类的属性和左表完全对应 sc => new { sc.StudentId, sc.GradeId, sc.ClassId }, // 关联后返回的结果结构 (student, score) => new { student.Name, score.MathScore, student.GradeId, student.ClassId });
场景2:包含非等值/自定义额外关联条件
标准Join方法仅支持等值匹配规则,如果需要添加大于、小于、范围判断等非等值的额外关联条件,需要用SelectMany + Where的组合实现,本质是对两个集合做笛卡尔积后按关联条件筛选,可灵活支持任意自定义关联规则。
示例代码(包含额外条件:数学成绩大于80分才关联):
var queryResult = students.SelectMany(s => scores // 所有关联规则都写在Where中,支持任意自定义条件 .Where(sc => sc.StudentId == s.Id && sc.GradeId == s.GradeId && sc.ClassId == s.ClassId && sc.MathScore > 80 // 非等值额外条件 ), // 关联后返回的结果结构 (student, score) => new { student.Name, score.MathScore, student.GradeId, student.ClassId });
如果需要实现左连接效果,只需在Where方法后追加.DefaultIfEmpty(),再额外处理右表属性为null的情况即可。
内容的提问来源于stack exchange,提问作者A.D.
相关产品推荐
相关产品推荐

