【发布时间】:2013-05-24 19:30:15
【问题描述】:
如何有效地更新父 EntityObject 属性以仅公开相关子实体集合属性的总和?每当任何子实体中的属性值发生变化时,我都需要在父级中进行更新。
一个例子:我有一个父实体对象“公司”和一个相关子对象“员工”的集合。这些在 EF 中相互关联(一个公司到员工的集合)。在 Employee 部分类中,我添加了一个自定义计算属性“Salary”,在 Company 部分类中,我添加了一个自定义属性“TotalSalaries”。
现在,如果任何 Employee Salary 属性更新为新值,我想立即更新 Company 对象属性 TotalSalaries 值。
每当 Employee 属性发生变化时,我总是在 Company 对象中运行完整的查询,例如:
TotalSalaries = Me.Employees.Sum(Function(x) x.Salary)
...这看起来是一件非常低效的事情,尤其是如果 Employee 类中的所有自定义属性值都通过循环进行了更改(例如,上面的查询一遍又一遍地运行)。
属性更新能否更高效地反映在父类中?
【问题讨论】:
-
它可能看起来效率低下,但实际上如果一切都在内存中运行,它可能会快如闪电。只有当它无法接受地延迟它所影响的一切时,我才会尝试优化它。
-
好吧,它可能很快,但认为它可以做得更快:假设我有 100 000 名员工,其中一名员工的工资增长了 10%(原始值 1000 -> 1100 为例子)。我能否以某种方式仅将此 chage (+100) 传递给父对象并告诉对象“将此增加添加到您的 TotalSalaries”,而不是在 99 999 未更改的 100 000 个项目上运行查询。这可能吗?
-
第二种情况可能是所有这 100 000 名员工同时加薪 10%。现在,如果它在属性更改时激活,则此查询对所有员工运行超过 100 000 次 -> 但我们需要做的只是在所有个人工资值都更新后才运行一次。该怎么做?
-
不要更新
TotalSalaries。使它成为一个计算属性(我认为它首先是)。所以只在需要显示时才计算。那可以非常快。如有必要,您可以存储和显示计算的值,并设置一个布尔值,当工资发生变化时需要重新计算。
标签: entity-framework parent-child custom-properties