在 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; }
我遇到了一个问题,我一直在寻找解决方案,但运气不佳。
使用 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; }