C# 如何创建和填充嵌套的ViewModel以及

C# 如何创建和填充嵌套的ViewModel以及,c#,entity-framework-4,C#,Entity Framework 4,我有一个视图模型,它有一些严重的嵌套。我需要从EntityFramework4中填充它。我尝试创建一个大的linq语句来填充它,但它说它无法识别.ToList()方法。它编译得很好。运行时错误为 LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[ProductDepartment] ToList[ProductDepartment] (System.Collections.Gene

我有一个视图模型,它有一些严重的嵌套。我需要从EntityFramework4中填充它。我尝试创建一个大的linq语句来填充它,但它说它无法识别.ToList()方法。它编译得很好。运行时错误为

LINQ to Entities does not recognize the method 
'System.Collections.Generic.List`1[ProductDepartment] ToList[ProductDepartment]
(System.Collections.Generic.IEnumerable`1[ProductDepartment])' method, 
and this method cannot be translated into a store expression.
在不进行数千次数据库调用的情况下,有什么更有效的方法来填充这样的内容

List<Product> Products {
    int ID
    string Name
    ...
    List<Department> Departments {
        int ID
        string Name
    }
    List<Image> Images {
        int ID
        string Name
    }
    List<Price> Prices {
        int ID
        string Name
        List<Version> Versions {
            int ID
            string Name
            List<Pages> Pages {
                int ID
                string Name
}   }   }   }
更新:

修复方法是删除所有的.ToLists(),不管怎么说,它的效果更好


现在我必须对最终产品进行过滤和排序。

对于初学者来说,这是一个疯狂的模型,但我假设您已经知道这一点

你真的一次需要所有这些信息吗

我在这里扮演魔鬼代言人的角色,假设你是这样做的,在这种情况下,你有两个合乎逻辑的选择:

1) 正如@xandy提到的-使用。Include在一次调用中加载您的关联。这是假设您在EDMX中为实体设置了导航属性

2) 使用视图。将所有疯狂的连接逻辑放在数据库中,使您的EF从视图中进行非常简单的选择。这样做的缺点是,对视图的查询基本上变成只读的,因为我认为您无法对映射到视图的实体执行更新

因此,这是您的选择-如果这是一个用于显示数据的只读集合,请使用视图,否则将在一次点击中加载您的关联

另外,在编写LINQ查询时要小心——我发现您有多个.ToList语句,这将导致执行查询


建立您的查询,然后在最后执行一次.ToList。

为什么一次就需要所有这些信息?访问嵌套属性时可以使用延迟加载?

若要启用即时加载,请使用.include();参考:这是一个非常好的主意,但它正在加载嵌套。我检查并删除了所有的.ToList(),将返回类型更改为IEnumerable,然后对该对象执行了.ToList()。然后一切开始流动。但仍在寻找实现这一目标的最佳方法。:)网站。在300毫秒内提取所有数据更快,因为每个网站请求有300毫秒的延迟。我们做分页,但他们有600种产品,希望一次看到尽可能多的产品。超过600种产品的每个产品(6个部分)延迟2秒是不好的。回答您的问题,有导航属性,视图是一个非常好的主意(尽管会有很多冗余信息)ViewModels是只读的。无论如何,它要求我删除所有的.ToList(),因为出于某种原因它们不存在(无论如何效果更好),好建议!我将此标记为答案,因为嵌套的ToList()在技术上不起作用,而您的建议是删除它们,这就是答案。下一个问题是排序和筛选。
var myProducts = (from myProduct in DC.MyProducts
                  where p => p.productGroup == 1
                  select new Product {
                      ID = myProduct.ID,
                      Name = myProduct.Name,
                      Departments = (from myDept in DC.MyDepartments
                                     where q => q.fkey = myProduct.pkey
                                     select new Department {
                                         ID = myDept.ID,
                                         Name = myDept.Name
                                     }).ToList(),
                      ...
                      //Same field assignment with each nesting
                  }).ToList();