Объединение запросов LINQ с платформой сущности C # - PullRequest
1 голос
/ 13 декабря 2011

У меня есть запрос linq, который выбирает несколько полей из моей таблицы клиентов.

К этому методу применяются несколько фильтров, использующих Func<IQueryable<T>, IQueryable<T>> с .Invoke.

Исходный запрос по существу select * from customer.

Метод фильтра по существу select top 10

Выходной SQL равен select top 10 from (select * from customer)

В моей таблице клиентов более 1 000 000 строк, поэтому выполнение этого запроса в SSMS занимает около 7 секунд. Если я изменю выходной SQL на select top 10 from (select top 10 * from customer), запустив его в SSMS, тогда запрос будет мгновенным (как и следовало ожидать).

Мне интересно, знает ли кто-нибудь, что может привести к тому, что LINQ не будет так хорошо сочетать их, и есть ли лучший метод / обходной путь, который я могу применить.

Я должен отметить, что мой действительный код не выбран * он выбирает несколько полей, но нет ничего более сложного.

Я использую SQL Server 2008 и MVC 3 со структурой объекта (не знаю, какая версия)

Редактировать: я должен добавить, что он полностью IQueryable, ничего не оценивается до конца, и в результате длинное выполнение ограничивается этой единственной строкой.

1 Ответ

0 голосов
/ 13 декабря 2011

Не знаю, почему не оптимизируется.

Если метод фильтра действительно эквивалентен SELECT TOP 10, то вы можете сделать это следующим образом:

return query.Take(10);

, что решило бы select top 10 * from customer, а не более запутанную вещь, с которой вы оказались.

Если это не сработает, боюсь, мне понадобится немного больше деталей.

РЕДАКТИРОВАТЬ: чтобы уточнить, если вы делаете это в LINQ:

DataItems.Take(10).Take(10)

вы получите этот SQL:

SELECT TOP (10) [t1].[col1], [t1].[col2]
FROM (
    SELECT TOP (10) [t0].[col1], [t0].[col2]
    FROM [DataItem] AS [t0]
    ) AS [t1]

Так что, если вы можете как-то использовать Take(n), у вас все будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...