我有下面的查询,它返回按Registrations分组的CourseId's列表。
var coursesTest = (from r in db.Registrations
group r by r.CourseId into distinctCourses
select distinctCourses).ToList();我想继续查询和过滤这样的东西;
var coursesTest = (from r in db.Registrations
group r by r.CourseId into distinctCourses
from dc in distinctCourses
where dc.CourseName != null
select new
{
name = dc.CourseName,
Id = dc.CourseId
}).ToList();当我这样做的时候,我得到了Registrations的全部记录.为什么?
发布于 2015-09-22 18:57:33
你想知道为什么你不能这么做?试着用SQL来做它,就像你现在试图做的那样。不能选择未在组内指定的成员,也不能选择不属于聚合函数的成员。
这部分from dc in distinctGroups的作用类似于.SelectMany,它再次破坏了您的分组。这就是为什么你得到所有的成员,而不是他们被分组。如果在dll编译后打开dll,您可以看到它的工作方式。我在这里做了一个例子,这基本上是编译后的处理方式:

如果要从对象中选择特定属性,则需要在group by部件中按这两个属性分组,如下所示:
var coursesTest = (from r in registrations
where r.CourseName != null
group r by new { r.CourseId, r.CourseName } into distinctCourses
select distinctCourses.Key).ToList();属性Key将包含您在group by大小写中创建的匿名类型对象,并且它将正确地分组。
编辑:
进一步解释:
这是SQL的Linq解释,它的作用也是一样的。我不知道您对SQL熟悉多少,但是当您编写一个有组的查询时,您不能SELECT任何不是组成员的查询或聚合函数的一部分。例如,在COUNT(*)、SUM(Something)等版本中,在编写group <item> by <property(ies)> into <newGroup>时,newGroup具有Key属性,该属性自动包含您可以选择的所有元素,这些元素是您在group by中使用的元素。您可以进一步使用它,只需在这些属性之外添加一些聚合函数。
一些直观的例子:
SELECT COUNT(*) AS NumberOfCourses, CourseId, CourseName
FROM dbo.Courses
WHERE CourseName IS NOT NULL
GROUP BY CourseId, CourseName就像这样:
var result =
(from c in Courses
where c.CourseName != null
group c by new { c.CourseId, c.CourseName } into groupedCourses
select new { c.Key, NumberOfCourses = c.Count() }).ToList();因此,group by Key再次包含了您可以从初始课程c获得的所有可能的属性,这些属性都是您在group by中使用的属性。您可以使用它对现在拥有的集合进行进一步的扩展,通过一些聚合函数来扩展它,或者结果使它们全部返回。
发布于 2015-09-22 18:29:47
我想你可能需要这样的东西(所有的课程,其分组没有任何CourseName等于null的项目
var set = db.Registrations.GroupBy(v => v.CourseId)
.Where(x => x.All(y => y.CourseName != null))
.SelectMany(z => z)
.Select(a => new { Name = a.CourseName, Id = a.CourseId });如果您只希望所有的Registration对象都具有一个非空CourseName,那么为什么首先要将它们分组呢?只需过滤原始列表。
发布于 2015-09-22 18:33:51
试试这个:
var coursesTest = (from r in db.Registrations
group r by r.CourseId into distinctCourses
select distinctCourses)
.Select(c => new { Id = c.Key, CourseNames = c.Where(x => x.CourseName != null) });https://stackoverflow.com/questions/32724012
复制相似问题