0

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 个非活动订单)。

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

我无法完全理解这个相关问题

4

2 回答 2

0

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

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

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

于 2015-01-21T08:28:31.257 回答
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();

这就是为什么性能差异只是第一个查询。

于 2015-01-21T06:58:04.470 回答