计算属性中相关表的性能
本文关键字:性能 属性 计算 | 更新日期: 2023-09-27 17:49:45
看看是否有更好的方法。
我首先使用DB,并有一个名为Items的表。下面是我在部分类上指定的一个计算属性,用于扩展它,它使用相关表派生结果。这在技术上是可行的。我喜欢使用它的便利性,所有这些业务逻辑都是在域中一次性定义的,并且您可以使用复杂的代码来派生结果。
我唯一关心的问题是性能,当你拉回多个记录。使用SQL Profiler,我可以看到,如果您回拉50行Item,它将执行一个额外的查询来检索Work Order Details(在本例中是50次)!不知道为什么它不做一个连接,而不是做50个额外的读取??我有不止一个这样的计算属性到多个表,每个表都在做显式读取每一行=慢!
从Item表中拉回50行的结果是,SQL Profiler显示从数据库中读取了2,735行!!我不熟悉SQL Profiler,所以也许我误解了一些东西,但我知道它正在做很多DB读取。
- 为什么不做一个连接,而不是做一个显式读取相关表的每一行的项目?
- 实现这一目标的"最佳实践"是什么?有没有更好的办法?
.
[Display(Name = "Qty Allocated")]
public decimal QtyAllocated
{
get
{
if (this.TrackInventory)
{
var inProcessNonRemnantWorkOrderDetails = this.WorkOrderDetails.Where(wod =>
new[]
{
(int)WorkOrderStatus.Created,
(int)WorkOrderStatus.Released,
(int)WorkOrderStatus.InProcess
}.Contains(wod.WorkOrderHeader.StatusId)
&& wod.EstimatedQuantity >= 1 //Don't count remnants as allocated
);
var inProcessRemnantWorkOrderDetails = this.WorkOrderDetails.Where(wod =>
new[]
{
(int)WorkOrderStatus.Created,
(int)WorkOrderStatus.Released,
(int)WorkOrderStatus.InProcess
}.Contains(wod.WorkOrderHeader.StatusId)
&& wod.EstimatedQuantity > 0 && wod.EstimatedQuantity < 1 //gets just remnants
);
decimal qtyAllocated =
this.WorkOrderDetails == null
? 0
: inProcessNonRemnantWorkOrderDetails.Sum(a => (a.EstimatedQuantity - a.ActualQuantity));
if (qtyAllocated == 0 && inProcessRemnantWorkOrderDetails.Any())
{
qtyAllocated = 0.1M;
}
return qtyAllocated;
}
else
{
return 0;
}
}
}
Aron是正确的。当我在查询中使用Include()方法快速加载相关实体时,只需要对数据库进行一次访问。