我已经看到了这些问题的答案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 Object
(PersonDTO
)发送,该查询与Person
实体相同,但FirstName
字段除外。
我在.Net6中使用EF6。
1条答案
按热度按时间f87krz0w1#
如果组合
(LetterId, PersonId)
在连接表中是唯一的(通常是多对多),则对于特定的LetterId
值,从Person
到LetterPerson
的一对多关系变为一对一,因此您可以使用Select
或SelectMany
和filter来获取单个LetterPerson
条目,然后可以将其用于排序。例如,使用LINQ查询语法(对于此类查询更自然):
请注意,您不需要
Include
来访问LINQ to Entities查询中相关数据同样,对于投影查询,Include
将被忽略