【问题标题】:LINQ2SQL select orders and skip/takeLINQ2SQL 选择订单并跳过/接受
【发布时间】:2012-01-02 10:13:54
【问题描述】:

我有从餐桌接受订单的功能,但不是全部。它是skip (Page * Rows on page) 和take (Rows on page)。但是有很大的问题(在 Linq2SqlProfiler 中查看)。

  • 如果我打开 1 页(Skip = 0,Take = 50)我有执行时间:150 毫秒。
  • 如果我打开 2 页(Skip = 50,Take = 50)我有执行时间:205ms。
  • ...
  • 如果我打开 10 页(Skip = 450,Take = 50),我有执行时间: 1005 毫秒。
  • 如果我打开 15 页 (Skip = 700, Take = 50) 我有执行 时间:1700ms!

    public IEnumerable<Order> GetAllConfirmedOrders(DateTime firstDay, int? ProviderId = null, Guid? ManagerId = null, DateTime? date1 = null, DateTime? date2 = null, int iSkip = 0, int iTake = 50)
    {
        var predicate_order = PredicateBuilder.True<Order>();
        var predicate_orderlist = PredicateBuilder.True<OrderList>();
    
        if (ProviderId != null) predicate_orderlist = predicate_orderlist.And<OrderList>(ol => ol.ProviderAn == ProviderId);
        if (ManagerId != null) predicate_order = predicate_order.And<Order>(o => o.UserId == ManagerId);
        if (date1 != null && date2 != null) predicate_order = predicate_order.And<Order>(o => o.DateAdd >= date1 && o.DateAdd <= date2);
        else predicate_order = predicate_order.And<Order>(o => o.DateAdd >= firstDay);
    
        var orders = (from o in _dataContext.Orders
                      join ol in _dataContext.OrderLists.Where(predicate_orderlist) on o.Analit equals ol.OrderAn
                      where o.Status == 1
                      orderby o.DateAdd descending
                      select o).Where(predicate_order).Skip(iSkip).Take(iTake);
    
        return orders;
    }
    

有生成sql条件:

WHERE  [t2].[ROW_NUMBER] BETWEEN 50 /* @p2 */ + 1 AND 50 /* @p2 */ + 50 /* @p3 */
ORDER  BY [t2].[ROW_NUMBER]

WHERE  [t2].[ROW_NUMBER] BETWEEN 450 /* @p2 */ + 1 AND 450 /* @p2 */ + 50 /* @p3 */
ORDER  BY [t2].[ROW_NUMBER]

WHERE  [t2].[ROW_NUMBER] BETWEEN 700 /* @p2 */ + 1 AND 700 /* @p2 */ + 50 /* @p3 */
ORDER  BY [t2].[ROW_NUMBER]

真的正常吗?有没有办法将执行时间节省近 100-200 毫秒?

【问题讨论】:

  • 所有四个查询都很慢。检查您的索引!
  • 我遇到了这个问题,在努力解决内存不足或页面加载速度越来越慢之后,我找到了一个更好的解决方案,可以在没有内存压力的情况下流式传输所有数据。它涉及关闭DataContext 中的ObjectTrackingEnabled 属性:stackoverflow.com/questions/12468219/…

标签: c# asp.net sql linq linq-to-sql


【解决方案1】:

查看您提供的示例执行时间后,当您打开更多页面时,时间似乎呈线性增加(150 -> 200 -> ... -> 1005 -> 1700)。因此,当您到达第 15 页时,查询必须处理更多记录,才能获取与第 15 页对应的数据。我的猜测是第 15 页的问题不是问题,但总体而言,查询本身需要时间作为记录增加。您可以尝试通过调整表的索引来优化查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    相关资源
    最近更新 更多