我已经为主要实体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
答案 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();
在其他情况下更喜欢延迟加载。