Linq to sql 具有计数的Linq 2 SQL联接/组

Linq to sql 具有计数的Linq 2 SQL联接/组,linq-to-sql,Linq To 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

我不得不修改一个查询,添加一个额外的连接,以引入一个部门名称

            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=
从CLD在
(
从数据库中的C开始
从db.Links.Where中的L开始(w=>w.activitid==C.id).DefaultIfEmpty()
从db.Divisions.Where(w=>w.id==C.DivisionID.DefaultIfEmpty()中的D开始
其中C.ClientID==user.ClientID
选择新的
{
活动名称=C.名称,
活动id=C.id,
分部=D.名称,
Created=C.Created
}
)
按新的{id=CLD.campaign,Name=CLD.campaign,Division=CLD.Division,created=CLD.created}将CLD分组到G中
选择新的{campaigname=G.Key.Name,Campaignid=G.Key.id,Division=G.Key.Division??“,Created=G.Key.Created,Links=G.Count(b=>b.Campaignid!=null)}

在此查询中,所有行的分区名称都正确显示,但当链接数为0时,查询将返回1

我相信我在这两种情况下都很接近,但似乎找不到正确的语法。欢迎任何建议。很高兴能解决这两个问题,但希望最终能看到如何解决这两个问题


谢谢大家。

我找人看了一下,帮我整理一下。这是一个比我的第二个查询更简洁、更完整的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
        });