在 C# 中左连接同一个 DataContext LinQ 中的两个表

left join two tables in same DataContext LinQ in c#

我在同一个 DataContext 中有两个 table,如下所示。

 Table PersonnelInfo
    { 

        personnelId,
        personnelName ,          
        description,
        deathMonthYear,
        updatedBy,
        updatedAt

    }


Table PersonnelInfoOther
    { 

        personnelId,
        personnelName ,                      
        updatedBy,
        updatedAt

    }

我定义一个class如下:

  public class PersonnelInfoAll
    { 

        public short personnelId{get;set;}
        public string personnelName { get; set; }
        public string personnelNameOtherLan { get; set; }
        public string description { get; set; }
        public string deathMonthYear { get; set; }
        public int updatedBy { get; set; }
        public DateTime updatedAt { get; set; }  


    }


I need to left join first table with the second one and retrieve all the data as PersonnelInfoAll format:



public List<PersonnelInfoAllLan> GetPersonnelInfosAll()
    {
        var context = new BookDataClassesDataContext { ObjectTrackingEnabled = false };

        var personnelInfo = from u in context.PersonnelInfos
                            join b in context.PersonnelInfoOtherLans
                           on u.personnelId equals b.personnelId
                            select new PersonnelInfoAllLan
                            {
                                personnelId = u.personnelId,
                                personnelName = u.personnelName,
                                personnelNameOtherLan = b.personnelName,
                                description = u.description,
                                deathMonthYear = u.deathMonthYear,
                                updatedBy = u.updatedBy,
                                updatedAt = u.updatedAt
                            };





        return personnelInfo.ToList();
    }

这只给出了与两者匹配的一行。但我需要第一个 table 的所有记录。有没有大佬帮忙啊

使用group join:

    var personnelInfo = from p in context.PersonnelInfos
                        join l in context.PersonnelInfoOtherLans
                          on p.personnelId equals l.personnelId into g
                        from l in g.DefaultIfEmpty()
                        select new PersonnelInfoAllLan
                        {
                            personnelId = p.personnelId,
                            personnelName = p.personnelName,
                            personnelNameOtherLan = (l == null ? null : l.personnelName),
                            description = p.description,
                            deathMonthYear = p.deathMonthYear,
                            updatedBy = p.updatedBy,
                            updatedAt = p.updatedAt
                        };

如果某个人在 lans 中没有匹配项,那么 DefaultIfEmpty() 将从加入的组中 return null。这就是为什么您需要检查 l 以获得 null.