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

时间:2010-04-25 23:40:58

标签: linq-to-sql asp.net-mvc-2 entityset

好的,所以我有一个强类型的客户“详细信息”视图,该视图采用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);
}

一切都按预期工作!

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

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

我收到以下错误:

  

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

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

public IEnumerable<Space> ParkingSpaces
{
    get
    {
        return Spaces.AsEnumerable();
    }
}

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

我遗漏了一些简单的东西,或者我是否错误地接近了这个?

谢谢!

4 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:1)

除了你的小助手方法之外,还有两种方法可以做到。

您可以在页面中继承您的类的IEnumerable:

<%@ Page Language="C#"
    Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Space>>" %>

<% foreach (var item in Model)
   {

或者您可以将实体对象转换为IEnumerable:

<% foreach (var item in Model.Spaces as IEnumerable<Space>)
   {

答案 2 :(得分:1)

  • 首先使用View Models 而不是直接访问DTO 首选。 (请使用Automapper

  • 其次,强烈输入您的观点 视图模型和视图模型中有 一个IEnumerable或List传递给 查看,然后你可以迭代它

答案 3 :(得分:1)

只需在项目中添加System.Data.Linq的引用。