js0000505 Ответов: 1

Как мне отсортировать с помощью Entity framework core субколлекцию?


У меня есть следующие отношения n:m:
Клубы - ClubsMembers - Членов

Мне нравится загружать клуб с его членами, отсортированными по фамилии, с помощью ядра Entity Framework.

Что я уже пробовал:

Мои занятия таковы:

общественный разделяемого класса клуб
{
общественный клуб()
{
ClubsMembers = новый HashSet<clubmember>();
}
public int Id { get; set; }
public string Name { get; set; }

[InverseProperty ("Клуб")]
общедоступный виртуальный интерфейс ICollection&ЛТ;clubmember&ГТ; ClubsMembers { получить; набор; }
}

публичный частичный класс член Клуба
{
public int ClubId { get; set; }
public int MemberId { get; set; }

[ForeignKey ("ClubId")]
[InverseProperty ("Член Клуба")]
публичный виртуальный клуб Club { get; set; }
[ForeignKey ("MemberId")]
[InverseProperty ("Член Клуба")]
член Общественной виртуальной{ получить; набор; }
}

член Общественной разделяемого класса
{
public int Id { get; set; }
общественного строка имя { получить; набор; }
общественного строка имя { получить; набор; }
}

Я могу запросить членов клуба со следующим заявлением:

ВАР-клуб = ждут _context.Клубы
.Включает(с =&ГТ; в.ClubsMembers)
. ThenInclude(d = & gt; D.член)
.SingleOrDefaultAsync(м =&ГТ; м. Код == код);

Теперь я получаю членов клуба несортированными, это работает.
Но я не нашел способа отсортировать членов клуба по фамилии, как это (не работает)

ВАР-клуб = ждут _context.Клубы
.Включает(с =&ГТ; в.ClubsMembers.Заказатьпо(о =&ГТ; о'.Член.фамилия))
. ThenInclude(d = & gt; D.член)
.SingleOrDefaultAsync(м =&ГТ; м. Код == код);

1 Ответов

Рейтинг:
7

njammy

Проверьте этот образец, вставьте его в dotnetfiddle (он не работал, когда я пытался загрузить его)
или поместить в свое собственное консольное приложение.

Короткий ответ заключается в том, что данные не будут упорядочены внутри запроса таким образом, поэтому результат будет отсортирован по верхней части иерархии запросов сортировка по умолчанию.

чинить:
1. запросите данные, которые вы хотите упорядочить, в свою собственную переменную.
2. Используйте эту коллекцию в качестве основного списка для получения других данных, например, из названий клубов. вам просто иногда приходится переворачивать свое мышление об объектных запросах linq.

Также следите за тем, как вы включаете оператор, поскольку сначала вы должны включить данные родительской таблицы.

using System.Collections.Generic;
using System.Linq;
using System;

namespace ConsoleApplication1
{
    public class Program
    {
        private static IEnumerable<Club> _Clubs = new Club[]
        {
            new Club { Id = 1, Name = "Club1" },
            new Club { Id = 2, Name = "Club2" }
        };

        private static IEnumerable<Member> _Members = new Member[]
        {
            new Member { Id = 1, Name = "Joey" },
            new Member { Id = 2, Name = "Chandler" },
            new Member { Id = 3, Name = "Ross" },
            new Member { Id = 4, Name = "Phoebe" },
            new Member { Id = 5, Name = "Veronica" },
            new Member { Id = 6, Name = "Rachel" }
        };

        private static IEnumerable<ClubMember> _ClubMembers =
            Associate(_Clubs.Single(x => x.Id == 1), _Members.Where(x => new int[] { 1, 3, 5 }.Contains(x.Id)))
            .Concat(
            Associate(_Clubs.Single(x => x.Id == 2), _Members.Where(x => new int[] { 2, 4, 6 }.Contains(x.Id)))
            );

        public static void Main()
        {
            var clubsAsc = _Clubs.OrderBy(x => x.Name).Select(x => x.Name);
            var clubsDesc = _Clubs.OrderByDescending(x => x.Name).Select(x => x.Name);

            var club1membersAsc = _ClubMembers.Where(x=>x.ClubId==1).OrderBy(x => x.Member.Name);
            var club1membersDesc = _ClubMembers.Where(x=>x.ClubId==1).OrderByDescending(x => x.Member.Name);
            var club2MembersAsc = _ClubMembers.Where(x=>x.ClubId==2).OrderBy(x => x.Member.Name);
            var club2MembersDesc = _ClubMembers.Where(x=>x.ClubId==2).OrderByDescending(x => x.Member.Name);

            Console.WriteLine("Clubs ASC: " + Environment.NewLine + FormatText(clubsAsc));
            Console.WriteLine();
            Console.WriteLine("Clubs DESC: " + Environment.NewLine + FormatText(clubsDesc));
            Console.WriteLine();
            Console.WriteLine("Club1Members DESC:" + Environment.NewLine + FormatClubMembers(club1membersDesc));
            Console.WriteLine();
            Console.WriteLine("Club1Members ASC:" + Environment.NewLine + FormatClubMembers(club1membersAsc));
            Console.WriteLine();
            Console.WriteLine("Club2Members ASC:" + Environment.NewLine + FormatClubMembers(club2MembersAsc));
            Console.WriteLine();
            Console.WriteLine("Club2Members DESC:" + Environment.NewLine + FormatClubMembers(club2MembersDesc));

            Console.ReadKey();
        }

        public static string FormatText(IEnumerable<string> array)
        {
            return array.Aggregate((current, next) => current + Environment.NewLine + next);
        }

        public static string FormatClubMembers(IEnumerable<ClubMember> array)
        {
            return array.Select(x => FormatClubMember(x))
                .Aggregate((current, next) => current + Environment.NewLine + next);
        }

        public static string FormatClubMember(ClubMember cm)
        {
            return "Club: " + cm.Club.Name + " - " + "Member: " + cm.Member.Name;
        }

        private static IEnumerable<ClubMember> Associate(Club club, IEnumerable<Member> members)
        {
            foreach (var mem in members)
            {
                yield return new ClubMember
                {
                    Club = club,
                    ClubId = club.Id,
                    Member = mem,
                    MemberId = mem.Id
                };
            };
        }
    }

    public class Club
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class ClubMember
    {
        public int ClubId { get; set; }
        public int MemberId { get; set; }

        public virtual Club Club { get; set; }
        public virtual Member Member { get; set; }
    }

    public class Member
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}



Выход:

Клубы ASC:
Клуб1
Клуб2

Клубы по алфавиту:
Клуб2
Клуб1

Описание Club1Members :
Клуб: Club1-Член: Вероника
Клуб: Club1-Член: Росс
Клуб: Club1-Член: Joey

Club1Members АСК:
Клуб: Club1-Член: Joey
Клуб: Club1-Член: Росс
Клуб: Club1-Член: Вероника

Club2Members АСК:
Клуб: Club2-Член: Chandler
Клуб: Club2-Член: Фиби
Клуб: Club2-Член: Rachel

Club2Members алфавиту:
Клуб: Club2-Член: Rachel
Клуб: Club2-Член: Фиби
Клуб: Club2-Член: Chandler


js0000505

Ваше решение с перелистыванием основного списка на ClubMember работает :-)
Как старый SQL-парень, я должен научиться новому мышлению в Entity Framework-Linq

Спасибо!

njammy

Добро пожаловать, счастливое кодирование.