Linq with group by returning count 1 when when it should be 0
我对一个按返回对组进行计数的Linq查询有点问题。对于在mssql查询中返回0的结果,返回1。这是Linq:
1 2 3 4 5 6 7 8 9 10 11 12 | from qs in Ctx.QS join qq in Ctx.QQ on qs.ID equals qq.QSID join qt in Ctx.QT on qq.QTID equals qt.ID join qv in Ctx.QV on qt.QID equals qv.QID join qi in Ctx.QI on qs.ID equals qi.QSID join r in Ctx.R on qi.ID equals r.QIID into r_1 from rr in r_1.DefaultIfEmpty() where qv.ID == 1 group qs by new { qsId = qs.ID, qtId = qt.ID, qt.Title, qs.Name, qi.Group } into g orderby g.Key.qsId orderby g.Key.qtId select new { g.Key.qsId, g.Key.qtId, g.Key.Title, g.Key.Name, g.Key.Group, Qty = g.Count() }; |
我正在尝试转换此SQL查询:
1 2 3 4 5 6 7 8 9 10 | SELECT qs.ID, qt.ID, qt.TITLE, qs.NAME, qi.GROUP, COUNT(r.ID) FROM AVLQS qs INNER JOIN AVLQQ qq ON qs.ID = qq.QSID INNER JOIN AVLQT qt ON qq.AVLQTID = qt.ID INNER JOIN AVLQV qv ON qt.AVLQID = qv.AVLQID INNER JOIN AVLQI qi ON qs.ID = qi.AVLQSID LEFT JOIN AVLR r ON qi.ID = r.AVLQIID WHERE qv.ID = 1 GROUP BY qs.ID, qt.ID, qt.TITLE, qs.NAME, qi.GROUP ORDER BY qt.ID, qs.ID |
翻译几乎是100%,我看到的唯一区别是在count()函数中,但是我找不到在linq中执行SQL在count(r.id)中执行的操作的方法,因为在linq中,接受inside count()函数的谓词需要"qs"而不是(r)。
我的情况比"重复"问题中的情况要复杂一些,因为在我的例子中,count()中预期的对象不知道应该检查count()中的正确子对象。
听起来您需要进行两次更改来修复此部件,另一次更改顺序。
如果要查找左联接实际匹配某个内容(而不是"使用"
你还想更改你的
1 2 3 4 5 6 7 8 9 10 11 | from qs in Ctx.QS join qq in Ctx.QQ on qs.ID equals qq.QuestaoID join qt in Ctx.QT on qq.QTID equals qt.ID join qv in Ctx.QV on qt.QID equals qv.QID join qi in Ctx.QI on qs.ID equals qi.QSID join r in Ctx.R on qi.ID equals r.QIID into r_1 from rr in r_1.DefaultIfEmpty() where qv.ID == 1 group new { qs, rr } by new { qsId = qs.ID, qtId = qt.ID, qt.Title, qs.Name, qi.Group } into g orderby g.Key.qsId, g.Key.qtId select new { g.Key.qsId, g.Key.qtId, g.Key.Title, g.Key.Name, g.Key.Group, Qty = g.Count(x => x.rr != null) }; |
或者,正如Amit所指出的,您可以将
1 2 3 4 5 6 7 8 9 10 11 | from qs in Ctx.QS join qq in Ctx.QQ on qs.ID equals qq.QuestaoID join qt in Ctx.QT on qq.QTID equals qt.ID join qv in Ctx.QV on qt.QID equals qv.QID join qi in Ctx.QI on qs.ID equals qi.QSID join r in Ctx.R on qi.ID equals r.QIID into r_1 from rr in r_1.DefaultIfEmpty() where qv.ID == 1 group rr by new { qsId = qs.ID, qtId = qt.ID, qt.Title, qs.Name, qi.Group } into g orderby g.Key.qsId, g.Key.qtId select new { g.Key.qsId, g.Key.qtId, g.Key.Title, g.Key.Name, g.Key.Group, Qty = g.Count(rr => rr != null) }; |
只是戳一下:
1 2 3 4 5 6 7 8 9 10 11 12 | from qs in Ctx.QS join qq in Ctx.QQ on qs.ID equals qq.QuestaoID join qt in Ctx.QT on qq.QTID equals qt.ID join qv in Ctx.QV on qt.QID equals qv.QID join qi in Ctx.QI on qs.ID equals qi.QSID join r in Ctx.R on qi.ID equals r.QIID into r_1 from rr in r_1.DefaultIfEmpty() where qv.ID == 1 group rr by new { qsId = qs.ID, qtId = qt.ID, qt.Title, qs.Name, qi.Group } into g orderby g.Key.qsId orderby g.Key.qtId select new { g.Key.qsId, g.Key.qtId, g.Key.Title, g.Key.Name, g.Key.Group, Qty = g.Count(x=>x!=null) }; |