Linq - 加入已连接表的主键

时间:2017-07-26 15:40:30

标签: c# sql sql-server asp.net-mvc linq

来自T-SQL,我试图在示例ASP.Net mvc(c#)程序中使用基本数据集。

我有三张桌子,如下图所示(链接):

  1. 收藏集(PK IdCollection)
  2. Sprint(PK IdSprint,FK IdCollection)
  3. DeployDocuments(PK IdDeployDocuments,FK IdSprint)
  4. Table relationship diagram

    在我的asp.net mvc控制器中,我想将这个简单查询的linq等效数据集传递给视图:

    SELECT 
    c.TxCollectionName
    ,s.SprintNumber
    ,COUNT(dd.IdDeployDocument) [NumProjects]
    FROM Collections AS c
    JOIN Sprints AS s
        ON s.IdCollection = c.IdCollection
    LEFT JOIN DeployDocuments AS dd
        ON dd.IdSprint = s.IdSprint
    GROUP BY 
    c.TxCollectionName
    , s.SprintNumber;
    

    我不能,为了我的生活,弄清楚如何做到这一点! 一旦我尝试在linq中创建第二个连接(更不用说左连接)了。

    我之前刚刚使用:

    var CollectionSprints = db.Collections.Include(d => d.Sprints)
    

    但我也需要所有项目的总和(deployDocuments),所以现在我试图像这样讨价还价:

            var query = from Collections in db.Collections
                    join Sprints in db.Sprints on Collections.IdCollection equals Sprints.IdCollection
                    join DeployDocuments in db.DeployDocuments on DeployDocuments.IdSprint equals Sprints.IdSprint
    

    但是当我开始第二次加入时它会抛出错误,我应该读一下linq的限制吗?我应该采取一种完全不同的方法来解决这个问题吗?或者我应该只是GTFO并参加更多关于C#的课程

1 个答案:

答案 0 :(得分:1)

Linq左连接看起来与SQL左连接有点不同,所以它可能有点令人困惑。 This SO answer显示了编写Linq左连接的简便方法。 .DefaultIfEmpty()使第二个连接成为左连接。

以下是我提出的建议:

var result = (
    from c in Collections
    from s in Sprints.Where(s => s.IdCollection == c.IdCollection)
    from dd in DeployDocuments.Where(dd => dd.IdSprint == s.IdSprint).DefaultIfEmpty()
    select new { c, s, dd } )
.GroupBy(g => new { g.c.TxCollectionName, g.s.SprintNumber })
.Select(s => new { s.Key.TxCollectionName, s.Key.SprintNumber, NumProjects = s.Count() };