Quiero crear un repositorio DDD que devuelva entidades IQueryable que coincidan con las clases subyacentes de Linq a SQL, menos cualquier relación. Puedo devolver fácilmente entidades menos las relaciones con una nueva selección de campo, campo, ...} de Linq. ¿Cómo codigo la clase Entidad de repositorio? ¿Cómo puedo devolver un objeto del repositorio que tiene la clase de repositorio, no la clase de Linq a SQL, y aún así llenarlo con múltiples entidades de la selección de Linq? ¿Cómo haría referencia a esta clase devuelta en mi ViewModel?ASP.MVC: Repositorio que refleja IQueryable pero no Linq a SQL, DDD How to question
Soy muy nuevo en esto, por lo tanto, los errores obvios. ¿Me estoy perdiendo el bote y solo debería devolver Entidades completas del depósito, no una proyección? Todavía necesitaría quitar las relaciones de Linq a SQL antes de enviarlas desde el repositorio. ¿Estoy totalmente fuera de la base? Realmente quiero mantener el tipo de datos IQueryable.
Por ejemplo, mi LINQ a código SQL en mi repositorio:
public class MiniProduct
{
public MiniProduct(string ProductNo, string Name, string Description, double Price)
{ this.ProductNo = ProductNo;
this.Name = Name;
this.Description = Description;
this.Price = Price;
}
}
public IQueryable<MiniProduct> GetProductsByCategory(string productCategory)
{
return (from p in db.Products
from c in db.Categories
from pc in db.ProductCategories
where c.CategoryName == productCategory &&
c.CatID == pc.CatID &&
pc.ProductID == p.ProductID
select new { p.ProductNo, p.Name, p.Description, p.Price });
// how to return IQueryable<MiniProduct> instead of IQueryable<AnonymousType>???
}
Y en la vista (tratando de escribir fuertemente ViewModel) lo que sería mi modelo de tipo de datos y cómo hacer referencia desde el punto de vista?
<% Page Inherits="System.Web.Mvc.ViewPage<MyStore.Models.MiniProduct>" %>
Editar:
Cottsak facultado el código y lo hizo trabajar, por lo que gana la casilla de verificación. Sin embargo, Mark Seemann señaló que esta técnica causará efectos secundarios. Tenía razón en que proyectar o sub-establecer su POCO es malo. Después de hacer que el código funcionara, terminé haciendo una tonelada más de objetos de entidad, lo que causa complicaciones innecesarias. Finalmente cambié el código para reflejar las sugerencias de Mark.
Para agregar a las sugerencias de Cottsak: El valor de retorno de mi repositorio era IQueryable. El tipo de referencia del modelo de directiva de página era
Inherits="System.Web.Mvc.ViewPage<IQueryable<MyStore.Models.MiniProduct>>"
los campos del modelo se accede por:
Model.SingleOrDefault().ProductNo
Model.SingleOrDefault().Name
...
Y esto llevó a una
foreach (MyStore.Models.MiniProduct myproduct in Model) {}
Gracias a ambos por las respuestas.
Tiene la idea de vista fuertemente tipada correcta. Tu ejemplo es correcto. –