2013-12-17 7 views
5

Когда я использую Entity Framework против таблицы SQL, это относится только к нужным столбцам сгенерированного SQL:Entity Framework выбирает слишком много столбцов в представлениях

ctx.Types.Select(rdi => rdi.Name) 

становится

SELECT [Extent1].[Name] AS [Name] 
FROM [dbo].[Types] AS [Extent1] 

Однако, если я сделаю аналогичный запрос против представления SQL, Entity Framework генерирует SQL, ссылаясь на на каждую колонку на вид:

ViewTypes.Select(rdi => rdi.Name) 

становится

SELECT [Extent1].[Name] AS [Name] 
FROM (SELECT 
     [ViewTypes].[Name] AS [Name], 
     ... every other column in my view ... 
     FROM [dbo].[ViewReferenceDataTypes] AS [ViewReferenceDataTypes]) AS [Extent1] 

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

Есть ли веские основания для Entity Framework сделать это? Есть ли способ сделать это не сделать это?

+0

ли вы включили LazyLoading? – Tico

+0

@Tico У меня нет навигационных свойств, поэтому я не думаю, что это важно. (Если это имеет значение, мой ответ «не знаю»!) – Rawling

+0

Hum..try Отключить его .. это не повредит; – Tico

ответ

1

Entity Framework EDMX генератор использует DefiningQuery элемент для определения набора сущностей на основе точки зрения, и это явно указывает SQL запрос вида по:

<EntitySet Name="custview" EntityType="AdventureWorksLTModel.Store.custview"> 
    <DefiningQuery>SELECT [custview].[CustomerID] AS [CustomerID], 
    [custview].[FirstName] AS [FirstName], 
    [custview].[LastName] AS [LastName], 
    [custview].[CompanyName] AS [CompanyName] 
    FROM [dbo].[custview] AS [custview] 
    </DefiningQuery> 
</EntitySet> 

так, единственный способ EF может применяться фильтрация выражение DefiningQuery является заворачивать с подзапросом. Если вы считаете, что это не эффективно для вашей базы данных, вы можете вручную отредактировать файл edmx в любом текстовом редакторе и указать любой требуемый запрос.

Там также QueryView элемент, который может быть возможно more effective

+0

Блестящий! Мне удалось найти и прокомментировать это, и это действительно сократит мой SQL. Похоже, что EF добавляет их намеренно, чтобы ускорить работу, если я попытаюсь «добавить» элемент к моему представлению; Я полагаю, что это зависит от меня, хочу ли я вместо этого использовать меньший SQL. – Rawling

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