В EF Core, как я могу выполнить группировку и выбрать список значений, разделенных запятыми? - PullRequest
2 голосов
/ 14 февраля 2020

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

При использовании 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: Column '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 ]

1 голос
/ 14 февраля 2020

Попробуйте использовать ниже 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();
0 голосов
/ 14 февраля 2020

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

    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))
                             });
...