2011-12-13 3 views
1

У меня есть запрос linq, который выбирает несколько полей из таблицы Customer.Объединение запросов LINQ с каркасом сущности C#

Применяются следующие фильтры: Func<IQueryable<T>, IQueryable<T>> с .Invoke.

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

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

Выход SQL является select top 10 from (select * from customer)

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

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

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

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

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

+0

Вы когда-нибудь решают эту проблему? –

+0

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

+0

Это классно. Пока у вас есть что-то, чтобы работать и работать нормально, это главное. –

ответ

0

Я не знаю, почему это не оптимизировано.

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

return query.Take(10); 

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

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

EDIT: Для того, чтобы уточнить, если вы делаете это в 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) вы будете в порядке.

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