我想创建一个DDD仓储库,返回与Linq to SQL底层类匹配的IQueryable实体,减去任何关联。我可以轻松地使用Linq选择新的{field,field,...}投影返回没有关系的实体。如何编写仓库实体类?如果要从仓库返回一个对象,而不是Linq to SQL类,如何填充它并从Linq选择中返回多个实体?在我的ViewModel中如何引用这个返回的类?
我很新手,所以可能会有明显的错误。我是否错过了什么,应该只从仓库返回完整的实体,而不是投影?我仍然需要在发送它们之前从仓库中剥离Linq to SQL的关系。我完全偏离了正确方向吗?我真的想保持IQueryable数据类型。
例如,在我的仓库中,我的Linq to SQL代码:
我很新手,所以可能会有明显的错误。我是否错过了什么,应该只从仓库返回完整的实体,而不是投影?我仍然需要在发送它们之前从仓库中剥离Linq to SQL的关系。我完全偏离了正确方向吗?我真的想保持IQueryable数据类型。
例如,在我的仓库中,我的Linq to SQL代码:
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>???
}
在视图中(尝试强类型化ViewModel),我的模型数据类型是什么,如何从视图中引用?
<% Page Inherits="System.Web.Mvc.ViewPage<MyStore.Models.MiniProduct>" %>
编辑:
Cottsak对代码进行了优化,使其正常运行,因此他获得了复选框。但是,Mark Seemann指出这种技术会引起副作用,他的意见是,将POCO项目投影或子集化是不好的。在让代码正常运行后,我最终创建了更多的一次性实体对象,这导致了不必要的复杂性。最终,我根据Mark的建议修改了代码。
除了Cottsak的建议外:我的存储库返回值为IQueryable。页面指令模型参考类型为
Inherits="System.Web.Mvc.ViewPage<IQueryable<MyStore.Models.MiniProduct>>"
模型字段的访问方式:
Model.SingleOrDefault().ProductNo
Model.SingleOrDefault().Name
...
这导致了一个
foreach (MyStore.Models.MiniProduct myproduct in Model) {}
感谢两位回答者。