首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继续按对象对组进行过滤/查询?

问继续按对象对组进行过滤/查询?
EN

Stack Overflow用户
提问于 2015-09-22 18:14:50
回答 5查看 1.9K关注 0票数 3

我有下面的查询,它返回按Registrations分组的CourseId's列表。

代码语言:javascript
复制
var coursesTest = (from r in db.Registrations
                     group r by r.CourseId into distinctCourses
                     select distinctCourses).ToList();

我想继续查询和过滤这样的东西;

代码语言:javascript
复制
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的全部记录.为什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-09-22 18:57:33

你想知道为什么你不能这么做?试着用SQL来做它,就像你现在试图做的那样。不能选择未在组内指定的成员,也不能选择不属于聚合函数的成员。

这部分from dc in distinctGroups的作用类似于.SelectMany,它再次破坏了您的分组。这就是为什么你得到所有的成员,而不是他们被分组。如果在dll编译后打开dll,您可以看到它的工作方式。我在这里做了一个例子,这基本上是编译后的处理方式:

​

​

如果要从对象中选择特定属性,则需要在group by部件中按这两个属性分组,如下所示:

代码语言:javascript
复制
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中使用的元素。您可以进一步使用它,只需在这些属性之外添加一些聚合函数。

一些直观的例子:

代码语言:javascript
复制
SELECT COUNT(*) AS NumberOfCourses, CourseId, CourseName
FROM dbo.Courses
WHERE CourseName IS NOT NULL
GROUP BY CourseId, CourseName

就像这样:

代码语言:javascript
复制
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中使用的属性。您可以使用它对现在拥有的集合进行进一步的扩展,通过一些聚合函数来扩展它,或者结果使它们全部返回。

票数 2
EN

Stack Overflow用户

发布于 2015-09-22 18:29:47

我想你可能需要这样的东西(所有的课程,其分组没有任何CourseName等于null的项目

代码语言:javascript
复制
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,那么为什么首先要将它们分组呢?只需过滤原始列表。

票数 1
EN

Stack Overflow用户

发布于 2015-09-22 18:33:51

试试这个:

代码语言:javascript
复制
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) });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32724012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档