【发布时间】:2014-01-31 04:00:08
【问题描述】:
我有名为 Product 和 Orders 的商业模式,如下所示:
public class Product
{
public int ProductId {get; set;}
public string Name {get; set;}
}
public class Order
{
public int OrderId{get; set;}
public int ProductId {get; set;}
...
}
在我的存储库层中,我想返回一个产品集合,其中包含针对每个产品的订单计数,但我无法找出正确的方法或返回自定义结果集:
public ?? GetProductsWithOrderCount()
{
var resultSet = from p in Products
join o in Orders on p.ProductId equals o.ProductId into grp
select new
{
Product = p,
OrdersCount = grp.Count(); // Does not work, just for demonstration
};
return resultSet;
}
现在我知道我可以使用IEnumerable<object> 作为返回类型,但是我必须将结果集转换到我在服务层中使用它的位置。
另一种选择是我可以创建另一个模型并返回 IEnumerable<ProductWithOrderCount> 但这会添加不代表我的系统的不必要模型:
public class ProductWithOrderCount
{
public Product Product {get; set;}
public int OrdersCount {get; set;}
}
还有其他方法吗?
【问题讨论】:
-
您必须创建包含 getter setter 这两个模型的视图模型
-
我相信,问题在于您正在使用存储库来返回摘要/聚合数据。该存储库用于返回 聚合根 - 顶级实体,然后您将在逻辑层中编写查询以生成计数。
-
View Models 应该在 UI 层,对吧?这是在存储库层中。
-
@Keith 问题在于我所有的存储库都返回
IEnumerables,这使得在服务层中查询数据的成本非常高。
标签: c# asp.net-mvc entity-framework architecture repository-pattern