Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用组和连接的C语言LINQ查询_C#_Linq - Fatal编程技术网

C# 使用组和连接的C语言LINQ查询

C# 使用组和连接的C语言LINQ查询,c#,linq,C#,Linq,我试图用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.

我试图用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。通常,还应包括单个选定字段以按列表分组

据我所知,一些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();

更新:不管投票结果如何,我坚信这是解决这个问题的正确方法——简单而自然。为什么要对已按主键分组的内容进行分组。

您确定SQL查询正确吗?我不认为这是因为SubjectName既不存在于GROUPBY子句中,也不存在于任何聚合函数中。是的,SQL查询是正确的。它正在返回预期结果是否使用SQL Server?@RahulSingh已更新。谢谢。马克,谢谢你提供有关函数相关字段的提示。这几乎肯定会对表中的每一行执行查询,从而导致极低的性能。@Corey很久以前可能是这样的-现在数据库查询优化器处理子查询的效率非常高,事实上,在需要时可以将它们转换为联接。在这种特殊情况下,很可能会使用简单的索引范围搜索。