繁体   English   中英

使用组和联接的C#中的LINQ查询

[英]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.SubjectIDb.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM