简体   繁体   English

如何在 EntityFramework 中按相关实体排序

[英]How to OrderBy by related entity in EntityFramework

i am developing an API which returns records about representatives, everything works fine, i am getting the desired results, the problem starts when i want to sort by a related entity.我正在开发一个 API ,它返回有关代表的记录,一切正常,我得到了预期的结果,当我想按相关实体排序时问题就开始了。 I am using Entity Framework to link the tables.我正在使用实体框架来链接表。

The following is a snippet of the DB diagram related to my piece of work.以下是与我的工作相关的 DB 图片段。 I would like to order by Level in Tier table.我想按等级表中的等级订购。 在此处输入图像描述

The following is my current working code:以下是我当前的工作代码:

 var profiles = _context.Profile
            .OrderBy(p => p.Person.FirstName)
            .Include(p => p.Person)
            .Include(p => p.Person.Address)
            .Include(p => p.Person.Representative.RepresentativeTierHistory)
              .ThenInclude(r => r.Tier)
            .Skip(start)
            .Take(limit);

        var mappedProfiles = _mapper.Map<List<ShortLeaderProfile>>(profiles);

If someone could guide me on how to order the results by Tier.Level i would be really thankful.如果有人可以指导我如何按 Tier.Level 排序结果,我将非常感激。 I have tried the following and it does not work..我尝试了以下方法,但它不起作用..

Attempt:试图:

.OrderBy(p => p.Person.Representative.RepresentativeTierHistory.OrderByDescending(t => t.Tier.Level))

This is my Mapping Code:这是我的映射代码:

   public ProfilesProfile()
    {
        MapAddressToLeaderProfile();
    }


    private void MapAddressToLeaderProfile()
    {
        CreateMap<Models.DataModels.Profile, ShortLeaderProfile>()
            .ForMember(lp => lp.Id, opt => opt.MapFrom(p => p.Person.Id))
            .ForMember(lp => lp.FirstName, opt => opt.MapFrom(p => p.Person.FirstName))
            .ForMember(lp => lp.LastName, opt => opt.MapFrom(p => p.Person.LastName))
            .ForMember(lp => lp.PreviousOccupation, opt => opt.MapFrom(p => p.PreviousOccupation))
            .ForMember(lp => lp.Code,
                opt => opt.MapFrom(p =>
                    ActiveTier(p.Person.Representative.RepresentativeTierHistory, DateTime.Now.Date)))
            .ForMember(lp => lp.location, spt => spt.MapFrom(l => l));

        CreateMap<Models.DataModels.Profile, Location>()
            .ForMember(lp => lp.Name, opt => opt.MapFrom(p => p.Person.Address.AddressCityOrTown))
            .ForMember(lp => lp.Latitude, opt => opt.MapFrom(p => p.Latitude))
            .ForMember(lp => lp.Longitude, opt => opt.MapFrom(p => p.Longitude));

    }

    public static string ActiveTier(IEnumerable<RepresentativeTierHistory> representativeTierHistories, DateTime now) =>
        representativeTierHistories?
            .SingleOrDefault(x => x.StartDate <= now && x.EndDate > now)?
            .Tier?
            .Code;
}

This is my Profile Entity Class:这是我的个人资料实体 Class:

[Table(nameof(Profile), Schema = "common")]
[ExcludeFromCodeCoverage]
public class Profile
{
    public int Id { get; set; }
    public string PreviousOccupation { get; set; }
    public string ShortDescription { get; set; }
    public string LongDescription { get; set; }
    [Column(TypeName = "numeric(10, 6)")]
    public decimal? Longitude { get; set; }
    [Column(TypeName = "numeric(10, 6)")]
    public decimal? Latitude { get; set; }
    public int DisplayOrder { get; set; }
    public int PersonId { get; set; }
    [ForeignKey(nameof(PersonId))]
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime RecordStartDateTime { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime RecordEndDatetime { get; set; }
    public List<ProfileSocialMedia> ProfileSocialMedias { get; set; }
    public Person Person { get; set; }

My Class Model:我的 Class Model:

 public class ShortLeaderProfile
{
    public int Id;
    public string FirstName;
    public string LastName;
    public string PreviousOccupation;
    [CanBeNull] public string Code;
    [CanBeNull] public Location location;
}
.OrderBy(p => p.Person.Representative.RepresentativeTierHistory.Max(t => t.Tier.Level))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM