我一直在使用以下技术在我的数据库中捏造计算值。
public class Invoice
{
public ICollection<Line> Lines {get;set;}
[AlwaysUpdate]
public Decimal Total { get { return this.CalcTotal; } set{} }
public Decimal CalcTotal
{
get
{
return this.Lines.Sum( l => l.Price * l.Quantity );
}
}
}
这种技术允许我在我的数据库中存储总计发票,如果行完全更改,则由于我的[AlwaysUpdate]
属性,Total会自动更新并保存。
如果我查询这样的发票:
_repository.Invoices.Select( i => i.Total );
实体框架将获取数据库的总数,而不是调用CalcTotal
。
但是,如果我这样做:
_repository.Invoices.ToList().Select( i => i.Total );
实体框架将调用CalcTotal
。
通常这是我想要的行为,但我现在遇到某个查询的问题。我必须使用ToList
将所有记录提取到内存中,但我不想在每个项目上调用CalcTotal
。
有没有办法在这里改变我的小黑客以支持不一直打电话给CalcTotal
?
答案 0 :(得分:1)
这不太棒,但你可以
public class Invoice
{
public ICollection<Line> Lines {get;set;}
private decimal _dbTotal;
[AlwaysUpdate]
public Decimal Total { get { return this.CalcTotal; } set{ _dbTotal = value; } }
public Decimal DBTotal { get { return _dbTotal;} }
public Decimal CalcTotal
{
get
{
return this.Lines.Sum( l => l.Price * l.Quantity );
}
}
}
DBTotal将始终返回存储在数据库中的总数,因此您可以针对DBTotal编写查询?