实体框架从中检索数据的子集

时间:2013-04-26 13:24:51

标签: c# entity-framework entity-framework-4

我有一个带外键的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)))

还是我在设计这个过程? (理论上,我喜欢从数据库中选择数据以获取状态和可选日期的方法,因此当我将数据传递到网页时,它需要做的就是显示它)

1 个答案:

答案 0 :(得分:0)

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

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