性能 - 通过导航属性和编译查询获取数据

时间:2015-01-21 06:39:20

标签: c# performance entity-framework navigation-properties compiled-query

我已经为主要实体customer和相关实体(订单)编译了查询。

var customer = MyService.GetCustomer<Customer>().where(c => c.Id == fooId).ToList();
var customerOrders = MyService.GetOrders<Order>().where(o => o.CustomerId == fooId && o.IsActive).ToList();

但是我认为我可以通过导航属性获取所有订单而不是编译查询调用,因为customer已经通过以下代码加载到内存中:

var customerOrders = customer.Orders.where(o => o.IsActive).ToList();  // I didn't do filter further more

但是,当我衡量时间时,我找不到任何相当大的差异(数据库有500个客户和4000个订单。每个特定客户有30个有效订单和大约400个非活动订单)。

这两者中的哪一个会有更好的表现?

我无法完全理解这个related question

2 个答案:

答案 0 :(得分:0)

Linq to Entities将Linq查询转换为SQL。

var customer = MyService.GetCustomer<Customer>().where(c => c.Id == fooId).ToList();

这实际上可以简化,因为c.Id是唯一的:

Customer customer = MyService.GetCustomer<Customer>().SingleOrDefault(c=> c.Id == fooId);

您在此处所做的只是首先获得具有特定ID的客户。 (常数,不依赖于您查询的订单计数)

然后查询该客户的订单(此查询取决于该客户的订单数量):

var customerOrders = customer.Orders.where(o => o.IsActive).ToList();

然后你做另一个查询,它将导致与上面完全相同的SQL语句。

var customerOrders = MyService.GetOrders<Order>().where(o => o.CustomerId == fooId && o.IsActive).ToList();

这就是性能差异只是第一个查询的原因。

答案 1 :(得分:0)

你的方式取决于你的情况。 如果您要积极使用相关实体: 最好的方法是在你的查询中包含这个:

using System.Data.Entity;
...
var customer = MyService.GetCustomer<Customer>().where(c => c.Id == fooId).Include(u => u.Orders).ToList();

在其他情况下更喜欢延迟加载。