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

时间:2015-04-02 15:56:35

标签: c# linq sorting nested entity

我有这样的实体模型:

表单> FormResponse> FormItem> FormItemType

表单可以有多个FormResponses,但每个FormResponse可以有1个FormItem,FormItem可以有1个FormItem类型。

我正在尝试使用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();

由于

2 个答案:

答案 0 :(得分:0)

如果您希望此查询有效,您只需删除AsEnumerable()电话即可。然后,而不是在LINQ对象中完成所有这些工作,它将在数据库方面完成。

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

答案 1 :(得分:0)

表单可以有多个FormResponses,但每个FormResponse可以有1个FormItem,FormItem可以有1个FormItem类型。

您可以将FormItem和FormItemType合并到FormResponse