如何在 Linq 中对嵌套集合进行排序

How to sort nested collection in Linq

我有这样的实体模型:

表单 > FormResponse > FormItem > FormItemType

Form 可以有多个 FormResponse,但是每个 FormResponse 可以有 1 个 FormItem,FormItem 可以有 1 个 FormItem Type。

我正在尝试获取所有响应按 FormItem.ItemOrder 字段排序的表单。所以,这个问题是关于顺序的。

以下是我的实际尝试,但我对 ToList() 评估有疑问,我在哪里获得 FormResponses。这是否意味着将为每个表单评估 FormResponses?意思是,查询会很慢。 有没有更有效的方式来写下面的语句?

试图删除 ToList() 评估,在那种情况下我得到错误 IOrderedEnumerable<FormResponse> 无法转换为 ICollection<FormResponse>.

var forms = db.Forms
              .AsEnumerable()
              .Select(p => new Form 
                { 
                   Name = p.Name,
                   FormResponses = p.FormResponses.
                                    .OrderBy(i => i.FormItem.ItemOrder)
                                    .ToList(),
                   OrderNumber = p.OrderNumber
                })
              .ToList();

谢谢

如果您希望此查询高效,您需要做的就是删除 AsEnumerable() 调用。然后,不是在 LINQ to objects 中完成所有这些工作,而是在数据库方面完成。

当然,这项工作仍然需要完成,因为您已经给自己施加了约束,即您的最终输出是具有项目列表的项目列表。鉴于该要求,无法避免对外部集合中每个项目的每个子集合中的所有项目进行排序。

Form 可以有多个 FormResponse,但是每个 FormResponse 可以有 1 个 FormItem,FormItem 可以有 1 个 FormItem Type。

您可以将 FormItem 和 FormItemType 合并到 FormResponse