在LINQ中,如何对来自多对多关系的数据执行.OrderBy()?

4uqofj5v  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(182)

我已经看到了这些问题的答案In LINQ, how can I do an .OrderBy() on data that came from my .Include()?^^,但是,没有是我的问题的答案。
我有三个实体:信函、人员、信函人员如下:

public class Letter
{
    public int LetterId { get; set; }
    public string  Title { get; set; }

    //MtoM
    public ICollection<LetterPerson> LetterPersons { get; set; }
}

public class Person
{
    public int PersonId { get; set; }
    public string? FirstName { get; set; }
    public string? LastName { get; set; }

    //MtoM
    public ICollection<LetterPerson> LetterPersons { get; set; }
}

    public class LetterPerson
{
    public int LetterPersonId { get; set; }
    [ForeignKey("Letter")]
    public int LetterId { get; set; }
    [ForeignKey("Person")]
    public int PersonId { get; set; }
    public DateTimeOffset? AssignDate { get; set; }=DateTimeOffset.Now;
    public Letter Letter { get; set; }
    public Person Person { get; set; }
}

Letter实体通过LetterPerson实体与Person实体具有Many To Many关系。现在,我想根据特定字母的id获得人员列表,并根据LetterPerson的id排序。
我有类似下面的查询:

var PersonRec = await _dbContext.Persons
                    .Include(u => u.LetterPersons)
                    .Where(u => u.LetterPersons.Any(i => i.LetterId == LetterId))
                    .OrderBy(u => u.LetterPersons.LetterPersonId)
                    //.Include(u => u.LetterPersons.OrderBy(f=>f.LetterPersonId))
                    //.Where(u => u.LetterPersons.OrderBy(f=>f.LetterPersonId).Any(i => i.LetterId == LetterId))
                    //.OrderBy(u => u.LetterPersons.FirstOrDefault().LetterPersonId)
                    .ProjectTo<PersonDTO>(_mapperConfiguration).ToListAsync();

上面注解的代码是我所做的尝试,但仍然没有达到预期的结果。我需要.OrderBy(u => u.LetterPersons.LetterPersonId),但是,它清楚地给出了一个compile error

问题:

如何更正OrderBy部分?
请注意,我必须将查询作为Data Transfer ObjectPersonDTO)发送,该查询与Person实体相同,但FirstName字段除外。
我在.Net6中使用EF6。

f87krz0w

f87krz0w1#

如果组合(LetterId, PersonId)在连接表中是唯一的(通常是多对多),则对于特定的LetterId值,从PersonLetterPerson的一对多关系变为一对一,因此您可以使用SelectSelectMany和filter来获取单个LetterPerson条目,然后可以将其用于排序。
例如,使用LINQ查询语法(对于此类查询更自然):

var query =
(
    from p in _dbContext.Persons
    from lp in p.LetterPersons
    where lp.LetterId == LetterId
    orderby lp.LetterPersonId
    select p
)
.ProjectTo<PersonDTO>(_mapperConfiguration);

var result = await query.ToListAsync();

请注意,您不需要Include来访问LINQ to Entities查询中相关数据同样,对于投影查询,Include将被忽略

相关问题