2015-05-12 133 views
1

我坚持一个问题,我一直在寻找解决方案,但没有多少运气。实体框架中的计算属性

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

// 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层来实现它。

我很高兴在数据库中创建计算字段,如果有一个好的方法将它们映射到实体框架类。

+0

关键位在单词“先前记录”中。这需要外部输入,因此不可能将计算的属性封装在'GoodInventoryChange'类中。这通常是在单独的查询或专用域模型中要做的事情。对于可以封装的计算属性,你可以看看[DelegateDecompiler](https://github.com/hazzik/DelegateDecompiler)。 –

+0

使用视图怎么样? –

回答

1

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

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

我终于回到了这个任务,这工作就像一个梦。谢谢! :) –