5

好的,所以我有一个采用客户对象模型的强类型客户“详细信息”视图。

我正在使用 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

4 回答 4

14

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

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

于 2010-05-20T15:43:07.653 回答
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>)
   {
于 2010-04-25T23:51:08.943 回答
1
  • 首先,最好使用 View Models 而不是直接访问 DTO。(为此使用Automapper )

  • 其次,将您的视图强输入到 View Model 并在 View Model 中将 IEnumerable 或 List 传递给视图,然后您可以遍历它

于 2010-04-25T23:53:02.353 回答
1

只需添加System.Data.Linq对您项目的引用。

于 2010-09-29T19:03:21.440 回答