计算属性中相关表的性能

本文关键字:性能 属性 计算 | 更新日期: 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读取。

  1. 为什么不做一个连接,而不是做一个显式读取相关表的每一行的项目?
  2. 实现这一目标的"最佳实践"是什么?有没有更好的办法?

.

[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()方法快速加载相关实体时,只需要对数据库进行一次访问。