3

我知道实体框架还不支持子集合中的排序或过滤。我的想法是首先我获取数据然后使用foreach循环对其进行排序。结果给了我一个未排序的列表。我的目标是获得Participants(任何顺序)和CurrentHospitaliztions(按 id 降序排列),它是参与者的孩子。模型和查询如下。任何帮助都会得到帮助。

public class Participant
{
    public int Id { get; set; }
    .. other fields

    public ICollection<CurrentHospitalization> CurrentHospitalizations { get; set; }

    public Participant()
    {
        CurrentHospitalizations = new Collection<CurrentHospitalization>();
    }
}

public class CurrentHospitalization
{
    public int Id { get; set; }
    .. other fields

    public Participant Participant { get; set; }
    public int ParticipantId { get; set; }

}

我使用的查询:

public async Task<IEnumerable<Participant>> GetList()
{
     var participants = await context.Participants
        .Include(x => x.CurrentHospitalizations)
        .ToListAsync();

        foreach (var p in participants )
        {
            var s = p.CurrentHospitalizations;
            foreach (var q in s)
            {
                s.OrderByDescending(u => u.Id);
            }
        }

        return participants ;
}
4

2 回答 2

4

你在错误的地方排序了正确的部分,然后并没有真正用它做任何事情。您不需要嵌套迭代,您可以像这样从单个 foreach 循环中完成它:

foreach (var p in participants) 
    p.CurrentHospitalizations = p.CurrentHospitalizations.OrderByDescending( ch => ch.Id ).ToList();
于 2018-12-18T20:47:09.293 回答
0

您在这里遇到的问题是无法理解 LINQ 的基础知识并且没有阅读手册。

        var s = p.CurrentHospitalizations;
        foreach (var q in s)
        {
            s.OrderByDescending(u => u.Id);
        }

实际上除了浪费处理器时间之外什么也没做。

你做一个变量s。您将当前的 hospuzatlizations 分配给它,而不是排序。

然后你调用 OrderByDescending - 生成一个你可以执行的表达式,除非你永远不会执行它。所以,你创建了一些对象树 - 把它扔掉。

o.CurrentHospitalizations = s.OrderByDescending(u => u.Id).ToList()

将 s 分配为一个列表并执行它。ToList() 丢失了 - 以及分配它,所以排序的结果不只是被丢弃。

这些是 LINQ 基础知识 - orderby 等不会更改顺序,它们返回有序结果,您必须将其具体化。

于 2018-12-18T20:34:11.073 回答