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

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

我也不能完全理解这related question

回答

0

LINQ到实体转换的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的用户至上。 (常数,不依赖于你查询订单数)

然后查询该客户的订单(此查询有多少订单dependend这个客户有):

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

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

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

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

+0

因此,在这种情况下,导航属性查询比complied查询更好? – ManirajSS 2015-01-21 08:48:34

+0

我没有完全明白你编译查询的意思。但Linq to Entities只提供少量的支持功能。如果超过这些要求从数据库中获取更多数据,那么使用完整的数据进行计算和可能的减少,然后降低性能。看看这里https://msdn.microsoft.com/en-us/library/bb738550.aspx – 2015-01-21 09:03:35

+0

例如,如果你使用一些正则表达式来过滤你的数据,你将不得不调用例如.ToList()或.AsEnumerable( ),它将SQL语句发送到数据库并将结果集映射到对象。然后,您可以使用Linq to Objects来执行基于Regex的过滤 – 2015-01-21 09:09:08

0

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

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

在其他情况下,宁愿延迟加载。

+0

因此,查询导航属性将不会给编译查询带来任何性能改进? – ManirajSS 2015-01-21 08:47:48

+0

http://stackoverflow.com/questions/19319116/include-vs-load-performance-in-entityframework - 很好的解释 – 2015-01-21 09:18:39