Linq to sql ASP.NET MVC/LINQ:What';在视图中迭代Linq.EntitySet的正确方法是什么?

Linq to sql ASP.NET MVC/LINQ:What';在视图中迭代Linq.EntitySet的正确方法是什么?,linq-to-sql,asp.net-mvc-2,entityset,Linq To Sql,Asp.net Mvc 2,Entityset,好的,我有一个强类型的客户“细节”视图,它采用客户对象模型 我使用LINQ to SQL,每个客户都可以拥有多个(停车)空间 这是数据库中的FK关系,因此我的LINQ生成的客户模型有一个“空间”集合。太好了 下面是我的CustomerRepository中的一段代码片段,我在其中遍历客户的停车位,删除所有付款、停车位,最后删除客户: public void Delete(Customer customer) { foreach (Space s in customer.Spaces)

好的,我有一个强类型的客户“细节”视图,它采用客户对象模型

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

这是数据库中的FK关系,因此我的LINQ生成的客户模型有一个“空间”集合。太好了

下面是我的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 partial类中,并在视图中使用foreach来迭代ParkingSpaces,那么一切都会按预期工作:

public IEnumerable<Space> ParkingSpaces
{
    get
    {
        return Spaces.AsEnumerable();
    }
}
公共IEnumerable停车场
{
得到
{
返回空格;
}
}
这里的问题是我不想重复我自己。我还认为我可以使用ViewModel将空间集合传递给视图,但是LINQ已经在客户模型上推断并创建了Spaces属性,所以我认为仅使用它是最干净的

我错过了一些简单的东西,或者我处理得不正确


谢谢

除了您的小助手方法之外,还有两种方法可以做到这一点

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

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

<% foreach (var item in Model)
   {

  • 首先,使用视图模型 与直接访问DTO不同的是 喜欢。(用于此)

  • 第二,强烈键入您的视图以 视图模型和视图模型中的 传递给服务器的IEnumerable或List 视图,然后可以对其进行迭代


如果我回答这个问题有点晚了,很抱歉,但解决问题的正确方法是向web.config文件添加程序集引用,以便视图可以访问GetEnumerator()方法。可以使用页面compliation error中提供的程序集引用字符串执行此操作。 乙二醇


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

视图是否强类型为
IEnumerable
?如果不是,这可能就是为什么如果没有那一点帮助代码,您就无法枚举它。我的视图是强类型的Inherits=“System.Web.Mvc.ViewPage”也许我不够清楚,但视图提供了客户的帐户详细信息。客户有任意数量的空间,这些空间也应显示在此页面上。因此,我不想要空间列表,我想要客户帐户的详细视图,包括客户的空间。在不复制空间集合的情况下,如何创建视图模型?我使用NerdDinner教程作为模板,视图模型的示例是一个类,它接受客户对象模型,还添加了其他属性以补充传递的原始模型。在这种情况下,我将得到一个EntitySet空间以及一个单独的IEnumerable集合。你能给我指出一个资源的方向吗?它能解释构建这个视图模型的正确方法吗?谢谢经验法则是,视图所需的所有信息都将在您传递的视图模型中,因此此视图模型是定制的,并且将填充来自DTO或DTO的数据。如果您想传递IEnumerable,那么视图模型中会有一个IEnumerable作为第一个选项:正如我在原始帖子的评论中提到的,我不是简单地列出空格,而是显示详细的客户对象模型帐户信息,其中客户对象模型包含一组空格。对于第二个选项:我尝试在foreach语句中强制转换,但是我得到了以下错误:“无法隐式地将类型'System.Data.Linq.EntitySet'转换为'object'”--我认为使用视图模型方法是一种可行的方法,但我不想复制自己。这对我来说也很有效,默认情况下不会发生这种情况似乎很愚蠢。如果使用Razor view engine的ASP.Net MVC web应用程序,这个答案会发生什么变化?@beaudetious:不会。我将MVC与Razor一起使用,我将引用添加到了我的Web.config中,正如所描述的那样。瞧!它起作用了。
<% foreach (var item in Model.Spaces as IEnumerable<Space>)
   {