【问题标题】:In EF Core, how can I perform a group by and select a list of comma separated values?在 EF Core 中,如何执行分组并选择逗号分隔值列表?
【发布时间】:2020-02-13 21:13:15
【问题描述】:

在这个小的 ASP.Net Core 应用程序中,我试图按学生的注册日期对学生进行分组,并以逗号分隔的字符串返回学生的姓名,而不是另一种聚合。

在使用 SQL 时,我过去使用过 stuff 函数,但我无法在 LINQ 中执行作为子查询的等效操作。

Core 不允许我执行我最初尝试过的客户端 GroupBys。

不支持客户端 GroupBy。

我已尝试以下代码并收到 InvalidOperationException:

IQueryable<EnrollmentDateGroup> data =
        _context.Students
        .GroupBy(s => s.EnrollmentDate)
        .Select(s => new EnrollmentDateGroup()
        {
          EnrollmentDate = s.Key,
          StudentCount = s.Count(),
          //BELOW IS NOT WORKING
          StudentNamesCSV = string.Join(",", s.Select(x => x.FirstMidName + " " + x.LastName))
        });

另一个尝试和错误消息,不再使用已经分组的数据:

SqlException:列 'Student.EnrollmentDate' 在选择列表中无效,因为它既不包含在聚合函数或 GROUP BY 子句中。

//ALSO NOT WORKING
...
StudentNamesCSV = string.Join(",", _context.Students
  .Where(x => x.EnrollmentDate == s.Key)
  .Select(x => x.FirstMidName + " " + x.LastName))
...

欢迎任何想法!谢谢。

【问题讨论】:

  • 我认为您使用的是 EF Core 3.x?您可以通过明确指出您想要的方式来做客户GroupBy:将AsEnumerable() 放在GroupBy 之前。由于Student.EnrollmentDate 没有出现在您的第二个查询中,我不认为您的错误消息与您的查询正确匹配。

标签: entity-framework linq asp.net-core-mvc


【解决方案1】:

尝试使用下面的 linq 代码:

var result = ((from uu in _context.Students.AsEnumerable()
                       select new​
                       {​
                           EnrollmentDate = uu.EnrollmentDate,​
                           FullName = uu.FirstMidName + " " + uu.LastName​
                       }).GroupBy(cc => cc.EnrollmentDate).​
                       Select(s => new EnrollmentDateGroup()​
                       {​
                           EnrollmentDate = s.Key,​
                           StudentCount = s.Count(),​
                           StudentNamesCSV = string.Join(",", s.Select(ee => ee.FullName).ToList())​
                       })​
                       ).ToList();

【讨论】:

  • 这是否会将所有学生返回给客户端?
  • _context.Students.AsEnumerable() 从数据库中提取所有内容
【解决方案2】:

你可以试试这个方法

    var data =  _context.Students
                .GroupBy(s => s.EnrollmentDate)
                .Select(s => new 
                {
                    Key = s.Key,
                    listOfStudents = s.ToList()
                }).ToList();
    var result = data.Select(s => new EnrollmentDateGroup
                             {
                                 EnrollmentDate = s.Key,
                                 StudentCount = s.listOfStudents.Count,
                                 //BELOW IS NOT WORKING
                                 StudentNamesCSV = string.Join(",", s.listOfStudents.Select(x => x.FirstMidName + " " + x.LastName))
                             });

【讨论】:

  • 这能回答你的问题吗?如果您需要任何帮助,请告诉我@Marzipancake
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2012-03-07
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多