【问题标题】:Optimizing Linq query: order by优化 Linq 查询:order by
【发布时间】:2015-03-06 00:17:20
【问题描述】:

我有以下 Linq 查询,我发现我在其中执行 join 和 order by 的 LastRenewed 调用需要将近一分钟。以 out 的顺序将查询时间减少 30 秒。有没有办法优化 LastRenewed 调用?

from stats in db.Stats 
group stats by stats.Id into st
join logs in db.Logs on st.Key equals logs.Id
select new
{
    //bunch of queries
    ... 
    LastRenewed = (from books in (db.Books.Where(x => x.BookId == st.Key))
                   join customer in db.Customers on books.Id equals customer.Id
                   orderby customer.LastRenewed descending
                   select customer.LastRenewed)
                  .FirstOrDefault(),
    ...
}

【问题讨论】:

  • 你返回了多少数据?
  • LastRenewed 列上是否有索引?
  • 如果您要查询大量数据,我会使用 context.SQLQuery 并调用存储过程来获取您的数据。 EF 很酷,适用于简单的查询,但 SQL Engline 在某些情况下不可避免地会运行得更快。
  • 显示相关的数据库架构

标签: c# linq


【解决方案1】:

获取db.Books.Where(x => x.BookId == st.Key) 并将其存储在查询之外,然后像这样使用它:

object books = `db.Books.Where(x => x.BookId == st.Key)`
LastRenewed = (from books in (books))
               join customer in db.Customers on books.Id equals customer.Id
               orderby customer.LastRenewed descending
               select customer.LastRenewed)
              .FirstOrDefault(),

这应该会有所帮助。

【讨论】:

  • 这有什么帮助?它最终会变成 SQL,而且问题几乎肯定在 DB 端。
  • 是的,你完全正确。我应该更清楚地阅读这个问题。感谢您的澄清。看不到数据库端发生了什么,虽然如果是 EF,我发现它的运行速度比对数据库的标准 sql 读取器调用要慢。
猜你喜欢
  • 2011-05-13
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2012-06-12
相关资源
最近更新 更多