linq - left join 范例

//定义用于此范例演示的类
public class ProjectListModel
{
    public string Id { get; set; }
    public string ProjectTypeId { get; set; }
    public string YSState { get; set; }
    public string OpenEndData { get; set; }
}

public class state
{
    public string Id { get; set; }
    public string ProjectTypeId { get; set; }
}

public class State1
{
    public string Id { get; set; }
    public string YSState { get; set; }
}

public class State2
{
    public string Id { get; set; }
    public string OpenEndData { get; set; }
}

//下面是方法体内加以实现

//创建对象
List<state> test1 = new List<state>()
{
    new state()
    {
        Id = "1",
        ProjectTypeId = "a"
    },
    new state()
    {
        Id = "2",
        ProjectTypeId = "b"
    },
    new state()
    {
        Id = "3",
        ProjectTypeId = "c"
    },
    new state()
    {
        Id = "4",
        ProjectTypeId = "d"
    },
    new state()
    {
        Id = "6",
        ProjectTypeId = "f"
    }
};

List<State1> test2 = new List<State1>()
{
    new State1()
    {
        Id = "1",
        YSState = "Y"
    },
    new State1()
    {
        Id = "2",
        YSState = "N"
    },
    new State1()
    {
        Id = "3",
        YSState = "N"
    },
    new State1()
    {
        Id = "4",
        YSState = "Y"
    },
    new State1()
    {
        Id = "5",
        YSState = "Y"
    }
};

List<State2> test3 = new List<State2>()
{
    new State2()
    {
        Id = "6",
        OpenEndData = "F6"
    }
};

//【关注点】

var res2 = from f in test1
    //连接test3,加 DefaultIfEmpty() 实际就是为了保证如果test3与test1不匹配的时候,保证test1存在
    join j in test3
    on f.Id equals j.Id into JoinedEmpDept
    from j in JoinedEmpDept.DefaultIfEmpty()

    //连接test2
    join k in test2
    on f.Id equals k.Id into t3JoinedEmpDept
    from k in t3JoinedEmpDept.DefaultIfEmpty()

    orderby f.Id descending
    select new ProjectListModel
    {
        Id = f.Id,
        ProjectTypeId = f.ProjectTypeId,
        YSState = k != null ? k.YSState : " ",
        OpenEndData = j != null ? j.OpenEndData : ""
    };

//输出看看


foreach (var item in res2)
{
    Console.WriteLine("Id: " + item.Id + " - " + "ProjectTypeId: " + item.ProjectTypeId + " - " + "YSState: " + item.YSState + " - " + "OpenEndData: " + item.OpenEndData);
}

//结果展示

============================================================

//如果只去掉 test3 的 DefaultIfEmpty()处理,看看结果

//如果只去掉 test2 的 DefaultIfEmpty()处理,看看结果

//如果去掉test2、test3的DefaultIfEmpty()处理

什么结果都没了(无事发生~)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值