实体框架 - 加载子集合,按子属性排序

时间:2016-12-22 20:41:05

标签: c# entity-framework sorting

我正在处理一个应用程序,该应用程序有一些与List集合相关的错误,这些错误以不正确的顺序加载对象。我想修改DataMapper以按子属性StatementNumber(int)对List(语句)进行排序。

我对EF的掌握不是100%,但我发现了类似的问题,我认为第二个解决方案就是我需要的答案。我只是很难实现它。 Entity Framework loading child collection with sort order

在我修改之前,Data Mapper类中的现有代码:

public async Task<CoLab> GetCoLabAsync(int id)
{
    return await (from d in _sdContext.CoLabs
                .Include(d => d.Project)
                .Include(d => d.CoLabType)
                .Include(d => d.Clusters)
                .Include(d => d.Clusters.Select(c => c.Statements))
                .Include(d => d.Statements)
                .Include(d => d.TriggeringQuestion)
                .Include(d => d.CoLabLocations)
                .Include(d => d.Statements.Select(s => s.Clusters))
                .Include(d => d.Statements.Select(s => s.Votes))
            where d.Id == id
            select d).SingleOrDefaultAsync();
}

我未能成功实施排序解决方案:

public async Task<CoLab> GetCoLabAsync(int id)
{
    return await (from d in _sdContext.CoLabs
                .Include(d => d.Project)
                .Include(d => d.CoLabType)
                .Include(d => d.Clusters)
                .Include(d => d.Clusters.Select(c => c.Statements))
                .Include(d => new
                    {
                        D = d.Statements,
                        C = d.Statements.OrderBy(c => c.StatementNumber)
                    })
                .Include(d => d.TriggeringQuestion)
                .Include(d => d.CoLabLocations)
                .Include(d => d.Statements.Select(s => s.Clusters))
                .Include(d => d.Statements.Select(s => s.Votes))
            where d.Id == id
            select d).SingleOrDefaultAsync();
}

我做错了什么?

1 个答案:

答案 0 :(得分:3)

在实体的默认构造函数中,使用有序集而不是hashset或任何其他集合类型初始化集合字段。

您可以提供自定义比较器。 https://msdn.microsoft.com/en-us/library/dd412070(v=vs.110).aspx

这样,您的集合始终会被排序,您的对象模型可能会得到改进。

话虽如此,如果您不想更改您的实体,如您链接的回复中所述,请使用Load()方法对每个集合进行一次查询。