1

我正在加载ServiceTrips计划日历,想知道是否有最快的方法可以从许多表中急切地加载相关数据。

这是需要加载的模型(映射是每个具体类型的表)

public class ServiceTrip : BaseEntity
{
    public ICollection<Employee> Crew { get; set; }
    public ICollection<ServiceAssignment> Assignments { get; set; }
}

public class ServiceAssignment : BaseEntity
{
    public ServiceOrder ServiceOrder { get; set; }
    public DeliveryOrder DeliveryOrder { get; set; }
}

public class ServiceOrder : OrderBase { }
public class DeliveryOrder : OrderBase { }

public abstract class OrderBase : BaseEntity
{
    public ICollection<ServiceAssignment> Assignments { get; set; }
    public Sale Sale { get; set; }
}

public class Sale : BaseEntity
{
    public Employee Manager { get; set; }
    public Customer Customer { get; set; }
    public ICollection<ServiceOrder> ServiceOrders { get; set; }
    public ICollection<DeliveryOrder> DeliveryOrders { get; set; }
}

public class Employee : BaseEntity { }
public class Customer : BaseEntity { }

public abstract class BaseEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我基本上已经尝试过这样的事情,但不知道从哪里开始。

var tripsQuery = db.ServiceTrips

.Where(x => x.StartDate >= FirstDay && x.StartDate <= LastDay)

.Include(x => x.Crew)
.Include(x => x.ServiceAssignments)

.Include(x => x.ServiceAssignments.Select(y => y.DeliveryOrder))
.Include(x => x.ServiceAssignments.Select(y => y.ServiceOrder))

.Include(x => x.ServiceAssignments.Select(y => y.DeliveryOrder.Sale))
.Include(x => x.ServiceAssignments.Select(y => y.ServiceOrder.Sale))

.Include(x => x.ServiceAssignments.Select(y => y.DeliveryOrder.Sale.Customer))
.Include(x => x.ServiceAssignments.Select(y => y.ServiceOrder.Sale.Customer))

.Include(x => x.ServiceAssignments.Select(y => y.DeliveryOrder.Sale.Manager))
.Include(x => x.ServiceAssignments.Select(y => y.ServiceOrder.Sale.Manager))
;

该模型已针对该问题进行了简化。在生产中,我从大约 20 张桌子中抽出。加载大约需要 10-15 秒。我尝试每天异步加载,但这增加了加载的总时间。

4

1 回答 1

1

在我看来,当您发出一个连接 20 个表的复杂查询时,您可能希望从检查数据库本身开始

以下是一些指导原则(有些点与 SQL Server 相关,我冒昧地假设它是您正在使用的数据库)

  1. 检查原始 SQL 上的查询执行计划——如果在 SQL 中重现整个 EF 代码很耗时,可能只是其中的一部分——例如 ServiceTrips、ServiceAssignments 和 DeliveryOrder 表。这将使您了解索引等方面的瓶颈

  2. 检查由于数据的大小,网络延迟是否是瓶颈,而不是查询本身

  3. 考虑使用可能会提高性能的索引视图

  4. 架构——为了加速这种复杂的查询,使用某种缓存可能会存储相关数据——在你的情况下,可能是经理、船员等的名字。

于 2013-06-21T05:42:33.900 回答