【问题标题】:Performance - get data through navigation property vs compiled query性能 - 通过导航属性与编译查询获取数据
【发布时间】:2015-01-21 06:39:20
【问题描述】:

我已经为主要实体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

【问题讨论】:

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


    【解决方案1】:

    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();
    

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

    【讨论】:

    • 那么在这种情况下导航属性查询比编译查询好?
    • 我没有完全理解编译查询的意思。但是 Linq to Entities 仅提供少量支持的功能。如果超出了从数据库中获取更多数据所需的数量,则使用完整数据进行计算和可能的减少,这将降低性能。看看这里msdn.microsoft.com/en-us/library/bb738550.aspx
    • 例如,如果您使用一些正则表达式来过滤您的数据,您将不得不调用例如 .ToList() 或 .AsEnumerable() 这会将 SQL 语句发送到数据库并将结果集映射到对象.然后您可以使用 Linq to Objects 进行基于正则表达式的过滤
    • 在您的示例中,我没有看到任何已编译的查询
    【解决方案2】:

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多