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

如何使用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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:54:03