0

我一直在使用以下技术来伪造数据库中的计算值。

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 );
        }
     }
}

这种技术允许我在我的数据库中存储发票的总计,如果 Lines 发生变化,Total 会自动更新并保存,这要归功于我的[AlwaysUpdate]属性。

如果我像这样查询发票:

_repository.Invoices.Select( i => i.Total );

实体框架将去获取数据库的总数,而不是调用CalcTotal.

但是,如果我这样做:

_repository.Invoices.ToList().Select( i => i.Total );

实体框架将调用CalcTotal.

通常这是我想要的行为,但我现在对某个查询有疑问。我必须使用ToList将所有记录提取到内存中,但我不想调用CalcTotal每个项目。

有没有办法改变我的小技巧以支持不CalcTotal一直打电话?

4

1 回答 1

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 编写查询?

于 2013-02-12T10:36:47.383 回答