来自T-SQL,我试图在示例ASP.Net mvc(c#)程序中使用基本数据集。
我有三张桌子,如下图所示(链接):
在我的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#的课程
答案 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() };