work unit pattern net mvc framework first example asp linq-to-sql asp.net-mvc-2 entityset

linq to sql - unit - ASP.NET MVC/LINQ: ¿Cuál es la forma correcta de iterar a través de un Linq.EntitySet en una vista?



repository pattern c# mvc (4)

De acuerdo, tengo una vista de "Detalles" del cliente fuertemente tipada que toma un Modelo de objeto del Cliente.

Estoy usando LINQ to SQL y cada Cliente puede tener múltiples (estacionamiento) Espacios.

Esta es una relación FK en la base de datos por lo que mi modelo de Cliente generado por LINQ tiene una colección de "Espacios". ¡Estupendo!

Aquí hay un fragmento de código de mi CustomerRepository donde recorro las plazas de aparcamiento del Cliente para eliminar todos los pagos, espacios y finalmente el cliente:

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); }

¡Todo funciona como se espera!

Ahora, en mi vista "Detalles", quiero completar una tabla con los Espacios del cliente:

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

Obtuve el siguiente error:

La instrucción foreach no puede operar en variables del tipo ''System.Data.Linq.EntitySet'' porque ''System.Data.Linq.EntitySet'' no contiene una definición pública para ''GetEnumerator''

Finalmente, si agrego este bit de código a mi clase parcial Cliente y uso el foreach en la vista para iterar a través de ParkingSpaces, todo funciona como se espera:

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

El problema aquí es que no quiero repetirme. También estaba pensando que podría usar un ViewModel para pasar una colección de Spaces a la Vista, sin embargo, LINQ ya infiere y crea la propiedad Spaces en el modelo de Cliente, por lo que creo que sería más útil usarlo.

Me falta algo simple o me estoy acercando a esto de forma incorrecta?

¡Gracias!


Hay dos formas en que puede hacerlo, aparte de su pequeño método de ayuda.

Puedes heredar un IEnumerable de tu clase en la página:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Space>>" %> <% foreach (var item in Model) {

O puede convertir su objeto de entidad a un IEnumerable:

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


  • En primer lugar, es preferible utilizar View Models en lugar de acceder directamente a los DTO. (use Automapper para esto)

  • En segundo lugar, escriba con fuerza sus vistas para Ver el modelo y en el Modelo de vista tenga un IEnumerable o Lista pasado a la vista, luego puede recorrerlo


Lo siento si estoy un poco tarde respondiendo esto, pero el método correcto para resolver su problema es agregar una referencia de ensamblado a su archivo web.config para que la vista pueda acceder al método GetEnumerator (). Puede hacerlo utilizando la cadena de referencia de ensamblaje proporcionada en el error de compilación de la página. p.ej

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


Simplemente agregue una referencia a System.Data.Linq a su proyecto.