You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:30:44