В этом небольшом приложении ASP.Net Core я пытаюсь сгруппировать учащихся по дате их зачисления и вернуть имена учащихся в виде строки, разделенной запятыми, в отличие от другого вида агрегации.

При использовании SQL в прошлом я использовал функцию stuff и не смог выполнить эквивалентную операцию в качестве подзапроса в LINQ.

Ядро не позволяет мне выполнять на стороне клиента 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))
...

Любые идеи приветствуются! Спасибо.

2
Marzipancake 14 Фев 2020 в 00:13

2 ответа

Лучший ответ

Попробуйте использовать ниже 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();
1
Ryan 14 Фев 2020 в 07:23

Вы можете попробовать этот способ

    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))
                             });
0
Phong 13 Фев 2020 в 22:49