LINQ中如何对多对多关联数据执行OrderBy排序?
解决方案
问题出在你直接访问了Person的LetterPersons集合属性来获取LetterPersonId——因为LetterPersons是集合类型(比如ICollection<LetterPerson>),集合本身没有LetterPersonId这个属性,编译器自然会报错。要实现按中间表的LetterPersonId排序,需要先关联到对应的LetterPerson单条记录,再基于该字段排序。
以下是两种可行的写法,适配.NET6下的EF6环境:
写法一:从中间表LetterPerson出发查询(推荐)
直接以中间表为起点,筛选目标LetterId的记录,按LetterPersonId排序后关联Person实体,最后映射为PersonDTO:
int targetLetterId = // 你的目标LetterId var personDtoList = db.LetterPersons .Where(lp => lp.LetterId == targetLetterId) .OrderBy(lp => lp.LetterPersonId) // 直接用中间表的Id排序 .Select(lp => new PersonDTO { // 按你的DTO需求映射字段,示例如下: PersonId = lp.Person.PersonId, FirstName = lp.Person.FirstName, // 若DTO的FirstName有特殊处理,此处调整 // 其他DTO字段... }) .ToList();
写法二:从Person实体出发关联查询
通过SelectMany拆解Person的LetterPersons集合,筛选匹配目标LetterId的中间表记录,再基于该记录的LetterPersonId排序:
int targetLetterId = // 你的目标LetterId var personDtoList = db.Persons .SelectMany( person => person.LetterPersons.Where(lp => lp.LetterId == targetLetterId), (person, letterPerson) => new { Person = person, LetterPerson = letterPerson } ) .OrderBy(x => x.LetterPerson.LetterPersonId) // 基于拆解后的单条中间表记录排序 .Select(x => new PersonDTO { PersonId = x.Person.PersonId, FirstName = x.Person.FirstName, // 其他DTO字段... }) .ToList();
两种写法都能正确编译并实现需求,写法一更直接高效,因为减少了不必要的关联操作。
内容的提问来源于stack exchange,提问作者Sadabadi
相关产品推荐
相关产品推荐

