ASP.NET Core не может сортировать сгруппированные элементы - PullRequest
0 голосов
/ 06 февраля 2019

В моем приложении ASP.NET Core есть следующая модель:

public class LocationTypeGroup {
    public string Name { get; set; }
    public IEnumerable<LocationType> LocationTypes { get; set; } 
}

public class LocationType
{

    [Key]
    public int LocationTypeID { get; set; }

    public string Name { get; set; }

    public string IntExt { get; set; }
}

Я пытаюсь выполнить запрос, который группирует их по IntExt и сортирует по имени в каждой группе.

Следующее работает, но не сортирует:

    public async Task<List<LocationTypeGroup>> GetGroupedLocationTypes()
    {
        return await _context.LocationTypes
            .GroupBy(p => p.IntExt)
            .Select(g => new LocationTypeGroup
            {
                Name = g.Key,
                LocationTypes = g.Select(x => x)
            })
            .OrderBy(x=>x.Name)
            .ToListAsync();
    }

Если я перейду на это:

LocationTypes = g.Select(x => x).OrderBy(x => x)

Тогда я все еще не получу отсортированный результат.

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Возможно, EF не может построить SQL-запрос.

Поэтому вам нужно упростить его вручную.и разделить на 2 запроса:

var groups = await context.LocationTypes
                          .GroupBy(p => p.IntExt)
                          .ToListAsync();

return groups.Select(g => new LocationTypeGroup
              {
                  Name = g.Key,
                  LocationTypes = g.Select(x => x)
              })
             .OrderBy(x=>x.Name);

Первый запрос загружает просто группы, а второй сортирует их и преобразует в LocationTypeGroup.

0 голосов
/ 06 февраля 2019

Возможно, это вызвано слишком старой версией Entity Framework Core.Попробуйте этот подход, к тому же он будет дешевле:

//data is loaded into memory
var data = await _context.LocationTypes.ToListAsync();
//data's transform
var answer = data.GroupBy(x => x.IntExt)
                 .Select(x => new LocationTypeGroup
                 {
                     Name = x.Key,
                     LocationTypes = x.AsEnumerable()
                 }).OrderBy(x => x.Name).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...