0

我有一个带有外键等的工作 EF 系统,它使我能够为一家商店或连锁店拉回我的所有客户数据。

我使用以下代码获取数据。

var foo = from s in context.Shops
        where (s.ShopId == shopId)
        select s;

Shop 的导航属性定义为;

 [ForeignKey("ShopId")] 
 public virtual ICollection<CustomerOrder> CustomerOrders { get; set; }

除其他外,CustomerOrder 包含状态和完成日期。

因此,目前在我的代码中,我有以下内容返回自特定日期以来已完成的所有已完成订单(状态 7)。

[NotMapped]
public virtual List<CustomerOrder> TotalCompletedCustomerOrders(DateTime dt)
{
    return (from co in CustomerOrders where co.Status == 7 && co.CompletedDate > dt select co).ToList();            
}

这是我检索数据的最有效方式吗?(我很欣赏在枚举集合之前不会检索客户订单,但即便如此,系统也必须处理潜在的数千条记录才能找到在该日期之后完成的那些。是否可能或需要将状态和/或日期包含在原始查询?

我已经尝试了以下几种变体,但都没有奏效。

where (d.ParentBusinessId == parentId && (d.CustomerOrders.Select(co => co.Status == 7)))

还是我过度设计了这个过程?(理论上,我希望从数据库中选择数据以获取状态和可选日期的方法,所以当我将数据传递到网页时,它所要做的就是呈现它)

4

1 回答 1

0

在这种情况下,“系统”是 sql server,它的工作是从更大的集合中选择一组数据。如果查询执行计划表现不佳,您确实必须注意查询执行计划,但是担心 SQL Server 必须处理更大集合中的记录子集的想法是拥有 SQL Server 的全部意义所在。这样做非常有效。

在大多数情况下,您的原始查询已优化为执行子选择,因此只需让 EF 和 SQL Server 完成其工作,如果您遇到性能问题,请处理它。

于 2013-04-26T13:35:17.980 回答