2017-06-27 28 views
0

我不得不修改查询以添加额外的联接以引入分区名称。Linq 2 SQL加入/组包含计数

  var c = from C in db.Campaigns 
       join L in db.Links on C.id equals L.campaignID into CL 
       from CL2 in CL.DefaultIfEmpty() 
       join D in db.Divisions on CL2.divisionID equals D.id into CLD 
       from CLD2 in CLD.DefaultIfEmpty() 
       where C.ClientID == user.ClientID 
       group CLD2 by new { C.id, C.Name, Division = CLD2.Name, C.created } into G 
       select new { 
        CampaignName = G.Key.Name, 
        Campaignid = G.Key.id, 
        Division = G.Key.Division ?? "-", 
        Created = G.Key.created, 
        Links = G.Count(b => b.Name != null) }; 

我与它遇到的问题是,该司名称为空的每一行,当链接计数为0(这不应该是)。

于是,我就写了使用lambda不同的方式:

var c = from CLD in ( from C in db.Campaigns from L in db.Links.Where(w => w.campaignID == C.id).DefaultIfEmpty() from D in db.Divisions.Where(w => w.id == C.DivisionID).DefaultIfEmpty() where C.ClientID == user.ClientID select new { CampaignName = C.Name, Campaignid = C.id, Division = D.Name, Created = C.created } ) group CLD by new { id = CLD.Campaignid, Name = CLD.CampaignName, Division = CLD.Division, created = CLD.Created } into G select new { CampaignName = G.Key.Name, Campaignid = G.Key.id, Division = G.Key.Division ?? "-", Created = G.Key.created, Links = G.Count(b => b.Campaignid != null) };

在此查询,该司的名称正确显示所有行,但是当链接的次数为0,查询将返回1代替。

我相信我在两种情况下都很接近,但似乎无法找到正确的语法。欢迎任何建议。很高兴为任一查询提供修复,但很想最终看到如何解决这两个问题。

谢谢大家。

回答

0

嗯,我有人看着它,帮我把它整理出来。这是一个更简洁的查询,更完整的lambda比我的第二个更杂乱混合。所以希望这个例子可以帮助其他人。

  var x = db.Campaigns.Where(w => w.ClientID == user.ClientID) 
     .GroupJoin(db.Divisions, c => c.DivisionID, d => d.id, (c, d) => new { cmp = c, Division = d.FirstOrDefault().Name }) 
     .GroupJoin(db.Links, cdl => cdl.cmp.id, l => l.campaignID, (cdl, l) => new { cdl.cmp, cdl.Division, Links = l.Count() }) 
     .ToList() 
     .Select(s => new 
     { 
      CampaignName = s.cmp.Name, 
      Campaignid = s.cmp.id, 
      Division = s.Division ?? "-", 
      Created = s.cmp.created, 
      Links = s.Links 
     });