好的,所以我有一个强类型的客户“详细信息”视图,该视图采用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属性,所以我认为使用它是最干净的。
我遗漏了一些简单的东西,或者我是否错误地接近了这个?
谢谢!
答案 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
的引用。