C#中使用group和join的LINQ查询
本文关键字:join LINQ 查询 group | 更新日期: 2023-09-27 18:24:04
我正试图在LINQ C#中编写以下SQL查询,但无法获得group子句后的列。
SQL查询
/*get the number of questions by subject*/
select b.SubjectID, b.SubjectName, count(*) AS count
from QuestionsTable a, SubjectTable b
where a.SubjectID is not null AND a.SubjectID = b.SubjectID
GROUP BY a.SubjectID
LINQ查询
var result =(from a in db1.QuestionsTables
join b in db1.SubjectTables
on a.SubjectID equals b.SubjectID
where a.SubjectID != null
group a by a.SubjectID into g
select new { a.QuestionID, a.SubjectID, b.SubjectName
}).ToList();
您的SQL无法正确执行,因为您按a.Subject.ID
查询组,但选择了b.SubjectID
和b.SubjectName
。通常,您还应该将单个选定字段包括到GROUP BY
列表中。
(据我所知,一些SQL服务器可以处理函数相关字段,因此它们可以处理您的查询。但总的来说,这是错误的)。
所以你的工作查询应该是:
SELECT b.SubjectID, b.SubjectName, COUNT(*) AS Count
FROM QuestionsTable a, SubjectTable b
WHERE a.SubjectID is not null AND a.SubjectID = b.SubjectID
GROUP BY b.SubjectID, b.SubjectName
你的LINQ应该是
from a in db.QuestionsTable
join b in db.SubjectTable
on a.SubjectId equals b.SubjectId
where a.SubjectId != null
group b by new { b.SubjectId, b.SubjectName } into g
select new { g.Key.SubjectId, g.Key.SubjectName, g.Count() }
尽管可以按照您要求的方式进行,但可以以更简单自然的方式获得相同的结果,根本不需要分组,就像这个
// get the number of questions by subject
var result =
(from s in db1.SubjectTables
select new
{
s.SubjectID,
s.SubjectName,
Count = db1.QuestionsTables.Count(q => q.SubjectID == s.SubjectID)
}).ToList();
更新:不管反对票如何,我坚信这是解决这个特定问题的正确方法——简单而自然。为什么要对已经分组的东西进行分组(按主键)。