2015-03-05 6 views
0

У меня есть следующий запрос Linq, и я обнаружил, что вызов LastRenewed, где я выполняю соединение и порядок, занимает почти минуту. Выполняя заказ, вы сокращаете время запроса на 30 секунд. Есть ли способ, которым я могу оптимизировать вызов LastRenewed?Оптимизация запроса Linq: order by

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(), 
    ... 
} 
+0

Сколько данных вы возвращаете? – Greg

+3

У вас есть индекс в столбце LastRenewed? – Sam

+2

Если вы запрашиваете много данных, я бы использовал context.SQLQuery и вызывать хранимую процедуру для получения ваших данных. EF классный и все для несложных запросов, но SQL Engline в некоторых случаях неизбежно будет работать намного быстрее. –

ответ

-1

Возьмите db.Books.Where(x => x.BookId == st.Key) и хранить его somehwere вне запроса затем использовать его следующим образом:

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

Это должно помочь немного.

+1

Как это поможет? В конце концов, это просто превратится в SQL, и проблема почти наверняка будет на стороне БД. – juharr

+0

Да, ваше абсолютно правильно. Я должен был прочитать вопрос более четко. Спасибо за разъяснения. Не могу видеть, что происходит на стороне базы данных, хотя, если это EF, я обнаружил, что он работает медленнее, чем стандартный запрос чтения SQL-кода в базу данных. –

Смежные вопросы