在LINQ中有没有一种方法可以使用group by语法,并在group by子句中将列表作为参数?

hi3rlvi2  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(108)

我有一个应用程序,有助于管理学习者做资格。我们最近升级了我们的系统,以模拟教室。我需要写一段代码,将学习者按教室分组,其中包括他们注册的中心,他们正在做的资格和他们正在完成的单元。我尝试了下面的代码示例:

var midFlightLearners = _learnerRepository.GetAllMidFlightLearners();

var groupedMidFlightLearners = midFlightLearners.GroupBy(l => new
        {
            l.DeliveryCentreId,
            l.QualificationId,
            l.LearnerUnits.Select(lu => lru.Unit).ToList()
        });

然而,这并不像预期的那样工作。在创建教室时,学习者需要按他们正在学习的单元进行分组。有什么办法可以做到吗?

6ss1mwsb

6ss1mwsb1#

.NET BCL默认情况下不提供列表的自定义比较器(即默认使用一个-通过引用,ToList()将产生一个新的列表示例,所以所有的键都是不同的,因此你将有一个元素的组)。你需要使用一些自定义的key类型来实现Equals+GetHashcode或者将IEqualityComparer传递给GroupBy调用。
或者,您可以尝试将单位列表转换为字符串:

var groupedMidFlightLearners = midFlightLearners.GroupBy(l => new
{
   //...
   // use some "valid" delimeter
   LearnerUnits = string.Join("|||", l.LearnerUnits.Select(lu => lru.Unit).Order()) // or OrderBy(x => x)
});
hfwmuf9z

hfwmuf9z2#

无论如何不能在查询过程中使用ToList,因为这需要将所有数据带回客户端。
您可以使用字符串聚合来获取包含所有单位的单个值。
这不是100%可靠的,因为排序可能因行而异。您可以添加.Order(),但我不确定EF Core是否可以正确地将其转换为WITHIN GROUP (ORDER BY

var midFlightLearners = _learnerRepository.GetAllMidFlightLearners();

var groupedMidFlightLearners = midFlightLearners
    .Select(l => new {
        l, 
        Units = string.Join(",", l.LearnerUnits.Select(lu => lru.Unit) /* .Order() */ ),
    })
    .GroupBy(l => new
    {
        l.DeliveryCentreId,
        l.QualificationId,
        l.Units,
    });

相关问题