Улучшить запрос, сгенерированный из структуры сущностей - PullRequest
3 голосов
/ 14 сентября 2011

У меня есть запрос linq, подобный следующему:

var query = from c in Context.Customers select c;
var result = query.ToList();

Запрос Linq генерирует этот код tsql:

exec sp_executesql N'SELECT 
[Project1].[Id] AS [Id], 
[Project1].[Name] AS [Name], 
[Project1].[Email] AS [Email]
FROM ( SELECT 
    [Extent1].[Id] AS [Id],
    [Extent1].[Name] AS [Name], 
    [Extent1].[Email] AS [Email]
    FROM [dbo].[Customers] AS [Extent1] ) AS [Project1]

Есть ли способ не создавать подзапрос?

Ответы [ 3 ]

5 голосов
/ 14 сентября 2011

У вас есть доказательства того, что этот запрос вызывает проблемы с производительностью? Я полагаю, что оптимизатор запросов легко распознает это.

Если после профилирования вы уверены, что запрос является проблемой производительности (сомнительно) - и только , тогда - вы можете просто превратить запрос в хранимую процедуру и вызвать это вместо.

2 голосов
/ 14 сентября 2011

Вы используете такой инструмент, как Linq, потому что вы не хотите писать SQL, прежде чем отказаться от того, что вы должны хотя бы сравнить план запроса вашего предложенного SQL с генерируемым инструментом.В настоящий момент у меня нет доступа к SQL Studio, но я был бы немного удивлен, если бы планы запросов не были идентичны ...

РЕДАКТИРОВАТЬ: имея возможность проверить планы запросов,они на самом деле идентичны.

1 голос
/ 14 сентября 2011

Краткий ответ: Нет, вы не можете изменить этот запрос.

Длинный ответ: Если вы хотите переопределить провайдера Linq и генератор запросов, то, возможно, есть способ, но я сомневаюсь, что вы хотите это сделать. Вы также можете реализовать пользовательскую оболочку поставщика EF , которая будет принимать запрос, переданный из EF, и переформатировать его, но это также будет сложно - и медленно. Собираетесь ли вы написать собственный интерпретатор для запросов SQL?

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