如何在Linq中使用无重复的左连接填充集合对象

本文关键字:连接 填充 对象 集合 Linq | 更新日期: 2023-09-27 18:06:27

如何在Linq中使用不重复的左连接填充集合对象

public class List1
{
    public string EmpID { get; set; }
    public string EmpName { get; set; }
}
public class List2
{
    public string EmpID { get; set; }
    public string Addr1 { get; set; }
    public string Addr2 { get; set; }
}
List<List1> list1Obj = new List<List1>();
List<List2> list2Obj = new List<List2>();
list1Obj.Add(new List1 { EmpID = "001", EmpName = "EmpName1" });
list1Obj.Add(new List1 { EmpID = "002", EmpName = "EmpName2" });
list1Obj.Add(new List1 { EmpID = "003", EmpName = "EmpName3" });
list1Obj.Add(new List1 { EmpID = "004", EmpName = "EmpName4" });
list2Obj.Add(new List2 { Addr1 = "Addr11", Addr2 = "Addr21", EmpID = "001" });
list2Obj.Add(new List2 { Addr1 = "Addr12", Addr2 = "Addr22", EmpID = "001" });
list2Obj.Add(new List2 { Addr1 = "Addr13", Addr2 = "Addr23", EmpID = "002" });
list2Obj.Add(new List2 { Addr1 = "Addr14", Addr2 = "Addr24", EmpID = "002" });
list2Obj.Add(new List2 { Addr1 = "Addr15", Addr2 = "Addr25", EmpID = "003" });

如何填充List<Employee>下面使用linq左连接没有重复?

public class Employee
{
    public string EmpID { get; set; }
    public string EmpName { get; set; }
    public List<Address> EmpAddress { get; set; }
}

我试过下面的代码。它返回具有重复行的结果。

var employeeList =
    (from table1 in list1Obj
    join table2 in list2Obj on table1.EmpID equals table2.EmpID into t
    from st in t.DefaultIfEmpty()
    select new Employee
    {
        EmpID = table1.EmpID,
        EmpName = table1.EmpName,
        EmpAddress = (from s in list2Obj
                     where s.EmpID == table1.EmpID
                     select new Address { Addr1=s.Addr1, Addr2=s.Addr2}).ToList()
    })

如何在Linq中使用无重复的左连接填充集合对象

Join通常按匹配的内部记录的计数复制外部记录。你真正需要的是一个GroupJoin:

GroupJoin<TOuter,>产生分层结果,这意味着来自外部的元素与来自内部的匹配元素的集合配对。GroupJoin使您能够基于外部元素的每个元素的整个匹配集来获得结果。

var employeeList =
    (from e in list1Obj
     join a in list2Obj on e.EmpID equals a.EmpID into aGroup
     select new Employee
     {
         EmpID = e.EmpID,
         EmpName = e.EmpName,
         EmpAddress = 
             (from a in aGroup
              select new Address
              {
                  Addr1 = a.Addr1,
                  Addr2 = a.Addr2,
              }).ToList()
     }).ToList();

使用Lambda表达式可以完成如下操作

var employeeList2 = list1Obj.GroupJoin(list2Obj, l1 => l1.EmpID, l2 => l2.EmpID, (l1, l2) => new
        {
            l1,
            l2
        }).Select(row => new Employee
        {
            EmpID = row.l1.EmpID,
            EmpName = row.l1.EmpName,
            EmpAddress = row.l2.Select(add => new Address
            {
                Addr1 = add.Addr1,
                Addr2 = add.Addr2
            }).ToList()
        });