gpt4 book ai didi

c# - 继续过滤/查询分组依据到对象?

转载 作者:行者123 更新时间:2023-11-30 16:06:08 25 4
gpt4 key购买 nike

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

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记录集……为什么?

最佳答案

你想知道为什么你做不到吗?尝试按照您现在尝试的方式在 SQL 中执行此操作。您不能选择未在 group by 内指定或不属于聚合函数的成员。

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

ILDASM

如果你想从你的对象中选择特定的属性,那么你需要在你的 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 中创建的匿名类型对象案例,它将被正确分组。

编辑:

进一步说明:

这是 Linq 对 SQL 的解释,它的行为方式相同。我不确定您对 SQL 有多熟悉,但是当您编写具有分组依据的查询时,您不能 SELECT任何不属于您的分组依据或属于聚合函数的部分。例如COUNT(*) , SUM(Something)等。在 C# Linq 版本中,当您编写 group <item> by <property(ies)> into <newGroup> 时, 那newGroupKey自动包含您可以选择的所有元素的属性,这些是您在 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包含您可以从初始类(class)中获得的所有可能属性 c这些是你在 group by 中使用的那些.您可以使用它通过对您现在拥有的集合的一些聚合函数进一步扩展它,或者作为结果将它们全部取回。

关于c# - 继续过滤/查询分组依据到对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32724012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com