Сортировка по дочерним элементам в Entity Framework не возвращает отсортированный список - PullRequest
0 голосов
/ 18 декабря 2018

Я знаю, что Entity Framework пока не поддерживает сортировку или фильтрацию в дочерних коллекциях.Я подумал, что сначала я получаю данные, а затем использую цикл foreach для их сортировки.Результат дает мне несортированный список.Моя цель - получить Participants (любой порядок) и CurrentHospitaliztions (порядок по убыванию идентификатора), который является дочерним элементом участников.Модели и запрос ниже.Любая помощь будет оценена.

public class Participant
{
    public int Id { get; set; }
    .. other fields

    public ICollection<CurrentHospitalization> CurrentHospitalizations { get; set; }

    public Participant()
    {
        CurrentHospitalizations = new Collection<CurrentHospitalization>();
    }
}

public class CurrentHospitalization
{
    public int Id { get; set; }
    .. other fields

    public Participant Participant { get; set; }
    public int ParticipantId { get; set; }

}

Я использую запрос:

public async Task<IEnumerable<Participant>> GetList()
{
     var participants = await context.Participants
        .Include(x => x.CurrentHospitalizations)
        .ToListAsync();

        foreach (var p in participants )
        {
            var s = p.CurrentHospitalizations;
            foreach (var q in s)
            {
                s.OrderByDescending(u => u.Id);
            }
        }

        return participants ;
}

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Вы отсортировали нужную часть в неправильном месте, а затем ничего не сделали с ней.Вам не нужна вложенная итерация, вы можете просто сделать это из одного цикла foreach, например:

foreach (var p in participants) 
    p.CurrentHospitalizations = p.CurrentHospitalizations.OrderByDescending( ch => ch.Id ).ToList();
0 голосов
/ 18 декабря 2018

Что вы здесь видите, так это неспособность понять основы LINQ и не читать руководство.

        var s = p.CurrentHospitalizations;
        foreach (var q in s)
        {
            s.OrderByDescending(u => u.Id);
        }

фактически ничего не делает, кроме как тратить время процессора.

Вы делаете переменнуюs.Вы присваиваете ему текущие гостеприимства, не отсортированные.

Затем вы вызываете OrderByDescending - генерируете выражение, которое вы МОЖЕТЕ выполнить, за исключением того, что вы никогда не выполняете его.Итак, вы создали некоторое дерево объектов и - выбросите его.список и выполнить его.ToList () отсутствует, равно как и его назначение, поэтому отсортированный результат не просто отбрасывается.

Это основы LINQ - orderby и т. Д. Не меняют порядок, они возвращают упорядоченный результат иВы должны это материализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...