如何创建和填充嵌套的ViewModel

时间:2010-11-01 03:21:44

标签: c# entity-framework-4

我的View模型有一些严重的嵌套。我需要从实体框架4中填充它。我尝试创建一个大的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
}   }   }   }

可怕的Linq代码看起来像这样

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

更新

解决方法是删除所有.ToLists(),无论如何都能更好地工作。

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

2 个答案:

答案 0 :(得分:1)

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

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

我会在这里扮演魔鬼的拥护者并假设你这样做,在这种情况下你有几个合理的选择:

1)正如@xandy所提到的 - 使用 .Include 在一次调用中急切加载您的关联。这假设您已经为EDMX中的entites设置了导航属性。

2)使用视图。把所有疯狂的加入逻辑放在数据库中,让你的EF工作从视图中非常简单。这样做的缺点是您对视图的查询基本上变为只读,因为我不相信您可以对映射到视图的实体执行更新。

所以这是你的选择 - 如果这是一个用于显示数据的只读集合,请使用View,否则在一次点击中急切加载你的关联。

另外,在编写LINQ查询时要小心 - 我看到你有多个.ToList语句,这将导致查询被执行。

构建查询,然后在结尾执行一次.ToList。

答案 1 :(得分:1)

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