2014-01-04 2 views
3

Я хотел бы знать, как я могу улучшить генерирование запросов ФВ брать примерКак Ef генерации Tsql

У меня есть DbSet ItemControllers

Код Linq является:

ItemController.FirstOrDefault(x=>x.Name=="Acl") 

// euqilent Sql генерируется SQL является

exec sp_executesql N'SELECT 
    [Limit1].[Id] AS [Id], 
    [Limit1].[Name] AS [Name], 
    [Limit1].[ShortDescription] AS [ShortDescription], 
    [Limit1].[LongDescription] AS [LongDescription], 
    [Limit1].[DisplayName] AS [DisplayName], 
    [Limit1].[ModuleItem_Id] AS [ModuleItem_Id] 
    FROM (SELECT TOP (1) 
     [Extent1].[Id] AS [Id], 
     [Extent1].[Name] AS [Name], 
     [Extent1].[ShortDescription] AS [ShortDescription], 
     [Extent1].[LongDescription] AS [LongDescription], 
     [Extent1].[DisplayName] AS [DisplayName], 
     [Extent1].[ModuleItem_Id] AS [ModuleItem_Id] 
     FROM [dbo].[ItemControllers] AS [Extent1] 
     WHERE (([Extent1].[Name] = @p__linq__0) AND (NOT ([Extent1].[Name] IS NULL OR @p__linq__0 IS NULL))) OR (([Extent1].[Name] IS NULL) AND (@p__linq__0 IS NULL)) 
    ) AS [Limit1]',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'Acl' 

пожалуйста, проверьте TSQL почему EF создание такой аль Онг запрос, я могу просто получить результат

следуя запрос

SELECT TOP (1) 
      [Extent1].[Id] AS [Id], 
      [Extent1].[Name] AS [Name], 
      [Extent1].[ShortDescription] AS [ShortDescription], 
      [Extent1].[LongDescription] AS [LongDescription], 
      [Extent1].[DisplayName] AS [DisplayName], 
      [Extent1].[ModuleItem_Id] AS [ModuleItem_Id] 
      FROM [dbo].[ItemControllers] AS [Extent1] 
      WHERE [email protected] // few code removed for clarity 

.so мой вопрос, как я могу улучшить генерацию запроса EF объекта с помощью функции Linq

ответ

4

Я думаю, что если вы посмотрите на планы запросов для двух запросов (ваш и сгенерированный), вы найдете очень мало различий. Linq на самом деле довольно хорош в создании эффективного SQL, и на самом деле то, что он добавил к вашему запросу, будет иметь практически нулевую стоимость.

Единственное, что нужно проверить об этом SQL, это наличие индекса в столбце Имя.

Приветствия -

0

Я согласен с ответом выше, но есть способ контролировать то, что запрос SQL работает (если вы хотите сделать это), и это путем сопоставления хранимой процедуры (точный запрос, который вы хотите для запуска) в качестве ИМПОРТА ФУНКЦИЙ в Entity Framework. Затем вы вызываете свой импорт функции так же, как и ваш класс сущностей!

Конечно, это больше работает, потому что вам нужно написать SQL и хранимые процедуры, но вы можете сделать это, и он действительно запустит ваш точный SQL!

Кстати, дизайнер EF действительно хорош для создания пользовательских классов «_result» для ваших результатов. Вы делаете это, когда вы сопоставляете свой sproc как функцию импорта. Вы можете просмотреть возвращаемый набор внутри дизайнера и нажать кнопку «создать пользовательский класс».

Я на самом деле выполняю большую часть работы с EF через sprocs, потому что мне не нравится весь беспорядок сущностей. Я обычно возвращаю очень сложные классы, которые не обязательно, как я физически храню данные!

Сделайте снимок, и вам может понравиться.

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