【问题标题】:What's the best way to implement a calculated column?实现计算列的最佳方法是什么?
【发布时间】:2015-08-21 04:58:27
【问题描述】:

我正在使用实体框架 6 和数据库优先方法来构建项目,
假设这两个表:

Tasks
id | taskName | taskPrice
1  | Making UI| 100
2  | Debugging| 70

还有第二张桌子:

Employees
id | Name | spentHours| taskId | *totalPrice*
1  | Iman | 10        |  2     |  (10 * 70) = 700
2  | Sam  |  5        |  1     |  (5 * 100) = 500 

我需要让 totalPrice 值可用于我项目的所有部分,因此最好不要为每次使用都计算它。
为了实现这一点,到目前为止,我已经想到了这三个解决方案: 1- 我可以为 totalPrice 分配一列并更新它的值,我认为这不是最优化的方式,因为如果 taskPrice 发生变化,我需要重新计算和更新 totalPrice 值。

2-秒方法是使用存储过程。

3-和第三个是使用触发器。

就计算、开销和时间而言,哪种方法最优化?
如果有任何其他方法可以做到这一点,请告诉我。

【问题讨论】:

  • 这里的视图似乎是个不错的选择,
  • 您不应该在数据库中有计算列。只需在模型中有一个返回计算值的属性
  • @StephenMuecke 问题是每次我创建模型的新实例时,计算都会重新发生。
  • 应该是这样的!
  • 在循环中添加一个测试方法,初始化模型的 1000 个新实例(包括计算属性)。在我的笔记本电脑上,这需要 2 到 3 毫秒。它微不足道(就像记忆一样)

标签: .net sql-server asp.net-mvc entity-framework optimization


【解决方案1】:

您可以在 DDL 中拥有一个计算列。 CREATE TABLE 表名 ( id int, 名称 varchar(20) 花费时间, taskid int, fn_totalprice(spenthours, id) as totalprcie)

该函数可以创建函数 fn_totalprice花费时间 int, id int 作为 ( 选择 (e.spenthours*t.taskprice) 作为总价 来自员工 e e.@id=t.id 上的内部连接任务 t 返回总价 )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2020-09-26
    • 2010-09-09
    • 1970-01-01
    • 2013-03-17
    相关资源
    最近更新 更多