我遇到了一个问题,我一直在寻找解决方案,但没有太多运气。
使用实体框架代码首先,我需要能够创建一个不依赖于在计算之前加载所有对象的计算属性。
// 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类,我可以在数据库中创建计算字段。
答案 0 :(得分:1)
您可以在数据库中使用计算列,并使用DatabaseGenerated属性修饰您的实体,以防止EF尝试将其值写回到表中。加载后,EF将在您插入或更新时读取其值:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string YourComputedProperty { get; set; }