当右侧列表为空时,左联接 LINQ

本文关键字:LINQ 列表 | 更新日期: 2023-09-27 18:33:20

pdlist = (from a in context.EMPLOYEES
          join b in context.PERSONS on a.PERSON_ID equals b.PERSON_ID
          where a.SUPERVISOR_ID == empId
          select new Pollidut.Models.Pollidut
          {
              PollidutId = a.EMPLOYEE_ID,
              PollidutName = b.PERSON_NAME,
              DistributionHouseId = a.DISTRIBUTION_HOUSE_ID == null ? 0 : (int)a.DISTRIBUTION_HOUSE_ID
          }).ToList();
DateTime dt = DateTime.Now.Date;
var pdTargets = (from p in context.PALLYDUT_TARGET
                 where p.Active == true && p.StartDate <= dt && p.EndDate >= dt
                 group p by p.PallydutId into g
                 select new
                 {
                     PollidutId = g.Key,
                     Start = g.Select(x => x.StartDate).Min(),
                     End = g.Select(y => y.EndDate).Max(),
                     Target = g.Select(z => z.Target).Sum()
                 }).ToList();
var PdTargetsList = (from m in pdlist
                     join n in pdTargets on m.PollidutId equals n.PollidutId into t
                     from l in t.DefaultIfEmpty()
                     select new
                     {
                          PallydutId = m.PollidutId,
                          PallydutName = m.PollidutName,
                          DistributionId = m.DistributionHouseId,
                          StartDate = l.Start == null ? dt : l.Start,
                          EndDate = l.End == null ? dt : l.End,
                          Target = l.Target == null ? 0 : l.Target
                     }).ToList();

pdlist是员工列表,pdTarget 可以设置或不设置。 pdTarget可以为空。当我离开 pdlist 与 pdTargets 时,我得到对象引用未设置错误。pdTargets 集合返回空值。如何解决它。任何人都帮助我非常感谢。

当右侧列表为空时,左联接 LINQ

我怀疑您获得Null reference exception的原因是因为您直接访问 null 对象上的属性(在您的情况下l),即使您使用的是 DefaultIfEmpty() 方法,如果未找到匹配的行,该方法将返回 null。你应该像这样更改你的代码:-

 select new
        {
           PallydutId = m.PollidutId,
           PallydutName = m.PollidutName,
           DistributionId = m.DistributionHouseId,
           StartDate = l == null ? dt : l.Start,
           EndDate = l == null ? dt : l.End,
           Target = l == null ? 0 : l.Target
        }).ToList();

另外,如果您认为您的一个对象pdTarget可以为 null,那么我认为它与左连接或普通连接无关,您的代码在任何一种情况下都会引发异常。请查看此 MSDN 文档以处理查询表达式中的空值。