ASP.NET MVC/LINQ:在View中迭代Linq.EntitySet的正确方法是什么?

Luc*_*Sam 5 entityset linq-to-sql asp.net-mvc-2

好的,所以我有一个强类型的客户"详细信息"视图,它采用Customer对象模型.

我正在使用LINQ to SQL,每个客户都可以拥有多个(停车)空间.

这是数据库中的FK关系,因此我的LINQ生成的Customer模型具有"Spaces"集合.大!

这是来自我的CustomerRepository的代码片段,我遍历客户的停车位以删除所有付款,空间,最后是客户:

public void Delete(Customer customer)
{
    foreach (Space s in customer.Spaces)
        db.Payments.DeleteAllOnSubmit(s.Payments);
    db.Spaces.DeleteAllOnSubmit(customer.Spaces);
    db.Customers.DeleteOnSubmit(customer);
}
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作!

现在在我的"详细信息"视图中,我想用客户的空间填充表格:

<% foreach (var s in Model.Spaces)
   { %>
    <tr>
        <td><%: s.ID %></td>
        <td><%: s.InstallDate %></td>
        <td><%: s.SpaceType %></td>
        <td><%: s.Meter %></td>
    </tr>
<% } %>
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

foreach语句不能对'System.Data.Linq.EntitySet'类型的变量进行操作,因为'System.Data.Linq.EntitySet'不包含'GetEnumerator'的公共定义

最后,如果我将这段代码添加到我的Customer部分类中并使用视图中的foreach迭代ParkingSpaces,一切都按预期工作:

public IEnumerable<Space> ParkingSpaces
{
    get
    {
        return Spaces.AsEnumerable();
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是我不想重复自己.我也在想我可以使用ViewModel将Spaces集合传递给View,但是LINQ已经推断并在Customer模型上创建了Spaces属性,所以我认为只使用它是最干净的.

我错过了一些简单的事情,或者我是否正确地接近这个?

谢谢!

小智 14

很抱歉,如果我有点迟到回答这个问题,但解决问题的正确方法是在web.config文件中添加一个程序集引用,以便视图可以访问GetEnumerator()方法.您可以使用页面补偿错误中提供的程序集引用字符串来执行此操作.例如

<add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>