实体框架中的计算属性

时间:2015-05-12 19:59:56

标签: c# entity-framework ef-code-first

我遇到了一个问题,我一直在寻找解决方案,但没有太多运气。

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

// 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()或类似内容,这可能需要加载1000多条记录才能找到单个条目。

最后,我需要能够查询:

// 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个字段需要以类似的方式计算。

有没有人有任何建议或指示指点我?我知道我可以强制它,但我希望通过实体框架的SQL层来实现它。

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

1 个答案:

答案 0 :(得分:1)

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

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