且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何使用实体框架核心对子集合进行排序?

更新时间:2023-02-13 13:32:14

查看此示例,将其粘贴在dotnetfiddle中(当我尝试上传它时它没有工作)

或者放入你自己的控制台应用程序。



简短回答是数据不会是奥德在查询中如此生成,因此得到的结果将按查询层次结构排序默认排序。



修复:

1.查询数据你想通过它自己的变量来订购。

2.使用该集合作为主要列表来获取其他数据,例如俱乐部名称。你有时不得不翻转你对对象查询linq的想法。



还要看你如何做Include语句,因为你应该首先包括父表数据。



Check out this sample, stick it in dotnetfiddle (it wasn't working when I tried to upload it)
or put into your own console app.

The short answer is data will not be ordered within query like that so resulting will be sorted by top of query hierarchy sort default.

to fix:
1. query the data you want to order by into its own variable.
2. use that collection as the main list to get other data from e.g. club names. you just sometimes have to flip your thinking about object queries linq.

Also watch how you do Include statement as you should include parent table data first.

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



俱乐部DESC:

俱乐部2

俱乐部1



Club1会员DESC:

俱乐部:Club1 - 会员:Veronica

俱乐部:Club1 - 会员:Ross

俱乐部:Club1 - 会员:Joey



Club1会员ASC :

俱乐部:Club1 - 会员:Joey

俱乐部:Club1 - 会员:Ross

俱乐部:Club1 - 会员:Veronica



Club2会员ASC:

俱乐部:Club2 - 会员:Chandler

俱乐部:Club2 - 会员:Phoebe

俱乐部:Club2 - 会员:Rachel



Club2会员DESC:

俱乐部:Club2 - 会员:Rachel

俱乐部:Club2 - 会员:Phoebe

俱乐部:Club2 - 会员:Chandler




Output:

Clubs ASC:
Club1
Club2

Clubs DESC:
Club2
Club1

Club1Members DESC:
Club: Club1 - Member: Veronica
Club: Club1 - Member: Ross
Club: Club1 - Member: Joey

Club1Members ASC:
Club: Club1 - Member: Joey
Club: Club1 - Member: Ross
Club: Club1 - Member: Veronica

Club2Members ASC:
Club: Club2 - Member: Chandler
Club: Club2 - Member: Phoebe
Club: Club2 - Member: Rachel

Club2Members DESC:
Club: Club2 - Member: Rachel
Club: Club2 - Member: Phoebe
Club: Club2 - Member: Chandler