2016-06-20 50 views
1
model.mTable = m_ctx.Shop 
.Where(t => t.CustomerID== model.mFilter.CustomerID) 
.Select(f => new GroupedData 
    { 
     iGroupID = f.iCustomerID, 
     dtGroupDt = new DateTime(f.dtDate.Year, f.dtDate.Month, f.dtDate.Day, f.dtStartTime.Hours, f.dtStartTime.Minutes, f.dtStartTime.Seconds, f.dtStartTime.Milliseconds), 
}) 
.OrderByDescending(f => f.dtGroupDt) 
.Take(2) 
.ToList(); 

商店是表和CustomerID是表的主键,但如果有大量的数据,然后这个查询给我超时异常。有没有什么办法来优化这个查询?如何优化此LinQ查询?

+0

是的。可能是他每天购买一些物品。确切的CustomerID是一种虚拟的东西。如果我说我需要它,假设5月10分钟后刷新的实时数据! –

+1

如果您将订单放在选择之前,它是否会改变任何内容?但是,为什么每个日期时间部分都有一列,而不是一个'datetime'类型的'dtGroupDt'列? –

+1

在“选择”之前使用'OrderByDescending(t => t.dtDate).ThenBy(t => t.dtStartTime)'可能会更快。 –

回答

1

有3件事情,应该帮助你在这里:

1)联合dtDatedtStartTime成一列,如果可能的话
2)创建于dtDate指数(见@TimothyStepansky评论),然后
3)重新排序如何执行您的查询(未经测试,语法可能不完全正确):

model.mTable = m_ctx.Shop 
       .Where(t => t.CustomerID== model.mFilter.CustomerID) 
       .OrderByDescending(t => t.dtDate) 
       .ThenBy(t => t.dtStartTime) 
       .Select(f => new GroupedData 
       { 
        iGroupID = f.iCustomerID, 
        dtGroupDt = new DateTime(f.dtDate.Year, f.dtDate.Month, f.dtDate.Day, f.dtStartTime.Hours, f.dtStartTime.Minutes, f.dtStartTime.Seconds, f.dtStartTime.Milliseconds), 
       }) 
       .Take(2) 
       .ToList();