2015-04-02 34 views
0

排序嵌套集我有实体模型是这样的:如何在LINQ的

表> 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(); 

感谢

回答

0

如果你想要这个查询是有效的,所有你需要做的是去除AsEnumerable()电话。然后,而不是在LINQ中完成所有这些工作,它将在数据库的一面完成。

当然,这项工作仍然需要完成,因为您已经给自己一个约束条件,即您的最终输出是包含项目列表的项目列表。考虑到这一要求,无法避免订购外部集合中每个项目的每个子集合中的所有项目。

+0

我试着删除AsEnumerable,但我得到的错误,说明实体或复杂类型MyModel.Form不能在LINQ构建以查询实体 – bobetko 2015-04-02 19:05:45

+0

@bobetko然后构建一个匿名类型在EF查询中,然后将其复制到内存中的“Form”中。 – Servy 2015-04-02 19:09:25

0

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

,您可以合并的FormItem和FormItemType到FormResponse