[英]LINQ query in C# using group and join
我正在尝试在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 Server可以处理功能相关字段 ,因此它们可以处理您的查询。但是总的来说,这是错误的)。
因此,您的工作查询应为:
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();
更新:无论投票否决,我都坚信这是解决此特定问题的正确方法-简单自然。 为什么要对已分组的内容进行分组(按主键)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.