Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq左外连接C#_C#_Linq_Left Join - Fatal编程技术网

Linq左外连接C#

Linq左外连接C#,c#,linq,left-join,C#,Linq,Left Join,我使用这个linq查询已经有一段时间了。我已经看了很多关于stackoverflow和其他问题的答案。我尝试过很多解决方案,也读过同样多的。下面的代码是我多次尝试创建此内部联接的两个代码。我得到的错误是 对象引用未设置为对象的实例 尝试一个 var records = from cr in lstContactResponse join jn in lstJourneyNodeData on cr.GrandparentId equals jn.Id into a from x in a

我使用这个linq查询已经有一段时间了。我已经看了很多关于stackoverflow和其他问题的答案。我尝试过很多解决方案,也读过同样多的。下面的代码是我多次尝试创建此内部联接的两个代码。我得到的错误是

对象引用未设置为对象的实例

尝试一个

var records = from cr in lstContactResponse
  join jn in lstJourneyNodeData on cr.GrandparentId equals jn.Id into a
  from x in a.DefaultIfEmpty()
  join j in lstJourney on x.JourneyId equals j.Id into b
  from y in b.DefaultIfEmpty()
  join ce in lstCampaignElement on y.Name equals ce.LinkedJourney into c
  from z in c.DefaultIfEmpty()
  join c in lstCampaign on z.CampaignId equals c.Id into d
  from w in d.DefaultIfEmpty()
  select new JourneyRecord
  {
      CompanyName = w.Company,
      BrandName = w.Brand,
      CampaignName = w.Name,
      Channel = z.Type,
      Wave = "",
      CampaignId = w.Id,
      ActivityDate = cr.ResponseDate,
      Activity = "",
      Unsubscribed = cr.Unsubscribed,
      Responded = cr.Responded,
      Clicked = cr.Clicked,
      Viewed = cr.Viewed,
      Sent = cr.Sent,
      Targeted = cr.Targeted,
      HardBounced = cr.HardBounced,
      SoftBounced = cr.SoftBounced,
      WasTargeted = cr.WasTargeted,
      Email = "",
      Id = "",
      CampaignElementId = z.Id,
      CampaignWaveId = "J" + x.Id,
      ContactId = cr.ContactId,
      AtTaskId = w.AtTaskId,
      LinkClicked = cr.Referrer,
      OptTopic = z.TopicId,
      DiseaseState = "",
      ElementDescription = y.Name,
      WaveDescription = x.Label
  };
尝试B

var records = from cr in lstContactResponse
    join jn in lstJourneyNodeData on cr.GrandparentId equals jn.Id into a
    from x in a.DefaultIfEmpty()
    join j in lstJourney on x.JourneyId equals j.Id into b
    from y in b.DefaultIfEmpty()
    join ce in lstCampaignElement on y.Name equals ce.LinkedJourney into c
    from z in c.DefaultIfEmpty()
    join c in lstCampaign on z.CampaignId equals c.Id into d
    from w in d.DefaultIfEmpty()
    select new JourneyRecord
    {
        CompanyName = x == null ? null : w.Company,
        BrandName = x == null ? null : w.Brand,
        CampaignName = x == null ? null : w.Name,
        Channel = x == null ? null : z.Type,
        Wave = "",
        CampaignId = x == null ? null : w.Id,
        ActivityDate = x == null ? null : cr.ResponseDate,
        Activity = "",
        Unsubscribed = x == null ? null : cr.Unsubscribed,
        Responded = x == null ? null : cr.Responded,
        Clicked = x == null ? null : cr.Clicked,
        Viewed = x == null ? null : cr.Viewed,
        Sent = x == null ? null : cr.Sent,
        Targeted = x == null ? null : cr.Targeted,
        HardBounced = x == null ? null : cr.HardBounced,
        SoftBounced = x == null ? null : cr.SoftBounced,
        WasTargeted = x == null ? null : cr.WasTargeted,
        Email = "",
        Id = "",
        CampaignElementId = x == null ? null : z.Id,
        CampaignWaveId = "J" + (x == null ? null : x.Id),
        ContactId = x == null ? null : cr.ContactId,
        AtTaskId = x == null ? null : w.AtTaskId,
        LinkClicked = x == null ? null : cr.Referrer,
        OptTopic = x == null ? null : z.TopicId,
        DiseaseState = "",
        ElementDescription = x == null ? null : y.Name,
        WaveDescription = x == null ? null : x.Label
    };
尝试C

var records = from cr in lstContactResponse
    join jn in lstJourneyNodeData on cr.GrandparentId equals jn.Id into a
    from x in a.DefaultIfEmpty()
    join j in lstJourney on x.JourneyId equals j.Id into b
    from y in b.DefaultIfEmpty()
    join ce in lstCampaignElement on y.Name equals ce.LinkedJourney into c
    from z in c.DefaultIfEmpty()
    join c in lstCampaign on z.CampaignId equals c.Id into d
    from w in d.DefaultIfEmpty()
    select new JourneyRecord
    {
        CompanyName = w == null ? null : w.Company,
        BrandName = w == null ? null : w.Brand,
        CampaignName = w == null ? null : w.Name,
        Channel = z == null ? null : z.Type,
        Wave = "",
        CampaignId = w == null ? null : w.Id,
        ActivityDate = cr == null ? null : cr.ResponseDate,
        Activity = "",
        Unsubscribed = cr == null ? null : cr.Unsubscribed,
        Responded = cr == null ? null : cr.Responded,
        Clicked = cr == null ? null : cr.Clicked,
        Viewed = cr == null ? null : cr.Viewed,
        Sent = cr == null ? null : cr.Sent,
        Targeted = cr == null ? null : cr.Targeted,
        HardBounced = cr == null ? null : cr.HardBounced,
        SoftBounced = cr == null ? null : cr.SoftBounced,
        WasTargeted = cr == null ? null : cr.WasTargeted,
        Email = "",
        Id = "",
        CampaignElementId = z == null ? null : z.Id,
        CampaignWaveId = "J" + (x == null ? null : x.Id),
        ContactId = cr == null ? null : cr.ContactId,
        AtTaskId = w == null ? null : w.AtTaskId,
        LinkClicked = cr == null ? null : cr.Referrer,
        OptTopic = z == null ? null : z.TopicId,
        DiseaseState = "",
        ElementDescription = y == null ? null : y.Name,
        WaveDescription = x == null ? null : x.Label
    };

林克没有办法让我决定去完成我想做的事情。因此,我采取了另一个方向来解决这个问题

foreach (ContactResponse cr in lstContactResponse)
    {
    ContactResponseRecord crr = new ContactResponseRecord() { 
                                                ContactId = cr.ContactId,   
                                                ActivityDate = cr.ResponseDate,   
                                                LinkClicked = cr.Referrer};


     var vJourneyNodeData = from x in lstJourneyNodeData where x.Id == cr.GrandparentId select x;
     if(null != vJourneyNodeData && vJourneyNodeData.Count() > 0)
            {
                jnd = vJourneyNodeData.FirstOrDefault();
                crr.CampaignWaveId = "J" + jnd.Id;
                crr.WaveDescription = jnd.Label;
            }

     var vJourney = from x in lstJourney where x.Id == jnd.JourneyId select x;
     if (null != vJourney && vJourney.Count() > 0)
            {
                j = vJourney.FirstOrDefault();
                crr.OptTopic = j.TopicId;
            }

     var vCampaignElement = from x in lstCampaignElement where x.LinkedJourney == j.Name select x;
     if (null != vCampaignElement && vCampaignElement.Count() > 0)
            {
                ce = vCampaignElement.FirstOrDefault();
                crr.Ccg_Id = ce.CCGId;
                crr.ElementDescription = ce.Description.ToString();
                crr.CampaignElementId = ce.Id;

      var vCampaign = from x in lstCampaign where x.Id == ce.CampaignId select x;
      if (null != vCampaign && vCampaign.Count() > 0)
                {
                    c = vCampaign.FirstOrDefault();
                    crr.ActivityDate = c.AtTaskId;
                    crr.BrandName = c.Brand;
                    crr.CampaignId = c.Id;
                    crr.CampaignName = c.Name;
                    crr.CompanyName = c.Company;
                }
            }

当然,在LINQ中有一种方法可以做到这一点。如果您在评论中回答了我的问题,我将为您提供确切的解决方案,现在我只给您举个例子。LINQ to对象与LINQ to实体的技术不同,因此以下内容适用于LINQ to对象

解决方案是检查左连接右侧涉及的每个属性,包括进一步连接。此外,还需要将值类型属性转换为nullable(这就是为什么对于以前的C#6代码,类很重要)

以下是一个例子:

有下列“表格”

C#6之前

var query =
    from e1 in t1
    join e2 in t2 on e1.Id equals e2.ParentId into g2
    from e2 in g2.DefaultIfEmpty()
    join e3 in t3 on e2 != null ? (int?)e2.Id : null equals e3.ParentId into g3
    from e3 in g3.DefaultIfEmpty()
    join e4 in t4 on e3 != null ? (int?)e3.Id : null equals e4.Id into g4
    from e4 in g4.DefaultIfEmpty()
    select new
    {
        t1_Id = e1.Id,
        t1_Name = e1.Name,
        t1_Date = e1.Date,
        t2_Id = e2 != null ? (int?)e2.Id : null,
        t2_Name = e2 != null ? e2.Name : null,
        t2_Date = e2 != null ? (DateTime?)e2.Date : null,
        t3_Id = e3 != null ? (int?)e3.Id : null,
        t3_Name = e3 != null ? e3.Name : null,
        t3_Date = e3 != null ? (DateTime?)e3.Date : null,
        t4_Id = e4 != null ? (int?)e4.Id : null,
        t4_Name = e4 != null ? e4.Name : null,
        t4_Date = e4 != null ? (DateTime?)e4.Date : null,
    };
var result = query.ToList();
看起来很难看,但很管用

C#6-只需在任何右侧属性访问器之前添加
,即可获得相同的结果(重复-包括连接条件)


尝试用.toList()包围查询。在对itI执行任何进一步的操作之前,也要检查“records”的值。我会在循环中这样做,以便在没有项的情况下程序不会崩溃。我甚至都无法进入这一行,这是查询后的下一行<代码>列表记录=空;如果(records!=null&&records.Count()>0){lstrecks=records.ToList();}您检查了所有列表值吗?即使在引用其他对象属性时,您也总是检查
x==null
。您需要更改检查以便检查相关对象,例如:
CompanyName=w==null?null:w.Company
在C#6中,您可以使用null条件运算符
CompanyName=w?.Company
Cool!非常感谢。我正忙着完成这个项目。
var query =
    from e1 in t1
    join e2 in t2 on e1.Id equals e2.ParentId into g2
    from e2 in g2.DefaultIfEmpty()
    join e3 in t3 on e2 != null ? (int?)e2.Id : null equals e3.ParentId into g3
    from e3 in g3.DefaultIfEmpty()
    join e4 in t4 on e3 != null ? (int?)e3.Id : null equals e4.Id into g4
    from e4 in g4.DefaultIfEmpty()
    select new
    {
        t1_Id = e1.Id,
        t1_Name = e1.Name,
        t1_Date = e1.Date,
        t2_Id = e2 != null ? (int?)e2.Id : null,
        t2_Name = e2 != null ? e2.Name : null,
        t2_Date = e2 != null ? (DateTime?)e2.Date : null,
        t3_Id = e3 != null ? (int?)e3.Id : null,
        t3_Name = e3 != null ? e3.Name : null,
        t3_Date = e3 != null ? (DateTime?)e3.Date : null,
        t4_Id = e4 != null ? (int?)e4.Id : null,
        t4_Name = e4 != null ? e4.Name : null,
        t4_Date = e4 != null ? (DateTime?)e4.Date : null,
    };
var result = query.ToList();
var query =
    from e1 in t1
    join e2 in t2 on e1.Id equals e2.ParentId into g2
    from e2 in g2.DefaultIfEmpty()
    join e3 in t3 on e2?.Id equals e3.ParentId into g3
    from e3 in g3.DefaultIfEmpty()
    join e4 in t4 on e3?.Id equals e4.Id into g4
    from e4 in g4.DefaultIfEmpty()
    select new
    {
        t1_Id = e1.Id,
        t1_Name = e1.Name,
        t1_Date = e1.Date,
        t2_Id = e2?.Id,
        t2_Name = e2?.Name,
        t2_Date = e2?.Date,
        t3_Id = e3?.Id,
        t3_Name = e3?.Name,
        t3_Date = e3?.Date,
        t4_Id = e4?.Id,
        t4_Name = e4?.Name,
        t4_Date = e4?.Date,
    };
var result = query.ToList();