在 Entity Framework 中计算出 属性

Calculated Property in Entity Framework

我遇到了一个问题,我一直在寻找解决方案,但运气不佳。

使用 Entity Framework 代码 首先,我需要能够创建一个计算 属性,它不依赖于在计算之前加载所有对象。

// Psuedo Code for what I need
public class GoodInventoryChange
{
    public int GoodID { get; set; }
    public double Amount { get; set; } // Amount of change
    public DateTime OccurredAt { get; set; } // Timestamp of the change
    public double RunningTotal { get { /* CODE TBD*/ } } // Prior record plus amount
}

我发现的所有关于如何执行此操作的建议都需要调用 .ToList() 或类似方法,这可能需要加载数千条记录才能找到单个条目。

最后,我需要能够查询:

// Psuedo Code
int goodID = 123;
var lowestRunningTotal = (from item in Context.GoodInventoryChanges
                          where item.GoodID == goodID && DateTime.Now <= item.OccurredAt
                          orderby item.RunningTotal 
                          select item).FirstOrDefault();

我在这里以 RunningTotal 为例,但我有大约 15-20 个字段需要以类似的方式计算。

有没有人有任何建议或方向可以指导我?我知道我可以暴力破解它,但我希望通过 Entity Framework.

的 SQL 层来做到这一点

我可以在数据库中创建计算字段,如果有一种很好的方法也可以将它们映射到 Entity Framework 类。

您可以在数据库中使用计算列,并使用 DatabaseGenerated 属性装饰您的实体,以防止 EF 尝试将其值写回 table。加载后,EF 将在您插入或更新时读取其值:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]    
public string YourComputedProperty { get; set; }