【发布时间】:2014-10-18 10:41:51
【问题描述】:
我正在尝试设计一个用于跟踪销售的新系统。我的数据模型的简化版本是:
public class Sale
{
public int SaleId { get; set; }
public DateTime CompletedDateTime { get; set; }
public virtual List<SaleItem> SaleItems { get; set; }
public decimal Total
{
get
{
return SaleItems.Sum(i => i.Price);
}
}
}
public class SaleItem
{
public int SaleItemId { get; set; }
public decimal Price { get; set; }
public int SaleId { get; set; }
public virtual Sale Sale { get; set; }
}
我现在正在编写一些报告,其中汇总了指定时期之间的销售价值。我有以下代码可以做到这一点:
List<Sale> dailySales = db.Sales
.Where(x => DbFunctions.TruncateTime(x.CompletedDateTime) >= fromParam)
.Where(x => DbFunctions.TruncateTime(x.CompletedDateTime) <= toParam)
.ToList();
decimal total = dailySales.Sum(x => x.Total);
这一切正常,并给了我预期的结果。我觉得这可能会给我带来更多问题,尽管一旦涉及到大型数据集。我假设必须将所有销售加载到列表中会占用大量资源,而且我的实际实现与每个销售项目相关联的税收、成本等,因此再次变得更加复杂。
以下将允许我对数据库进行所有处理,但由于数据库没有 Total 的表示,因此无法执行此操作,因此 EF 会引发错误:
Decimal total = db.Sales.Sum(x=>x.Total);
这引出了我的问题。我可以将我的模型设置为以下,每次添加 SaleItem 时,请确保更新 Total:
public class Sale
{
...
public decimal Total { get; set; }
}
这将允许我根据需要查询数据库,并且我认为资源密集度会降低。但另一方面是我减少了数据库中的冗余。后一种方法是更好的处理方法,还是有一种我什至没有考虑过的替代方法更好?
【问题讨论】:
-
看你是多读还是多写
标签: c# asp.net-mvc entity-framework database-design