2013-04-26 94 views
0

中检索数据的子集我有一个可以使用外键的工作EF系统,这样可以将我的所有客户数据都拉回到商店或连锁店。实体框架从

我使用下面的代码获取数据。

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

商店的导航属性定义为;

[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))) 

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

+0

如果你不确定,给这个http://www.hibernatingrhinos.com/products/efprof,这个工具也会提供一些你在做什么错误的帮助(即,选择n + 1等) – dbones 2013-04-26 15:18:23

回答

0

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

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

+0

不用担心。除非我们开始解决问题,否则我会保留原样。谢谢 – Matt 2013-04-26 13:50:27