2013-07-29 2 views
1

Когда я смотрю на SQL запрос, порожденного EF Я вижуEntity Framework, почему этот sql создается?

SELECT [extent1].ID as ID, 
[extent1].Name as Name 
From( 
Select myview.ID as ID, 
myview.Name as Name 
From myview) AS [extent1] 
Where([Extent1].ID = @p_linq_0) 

Почему выбрать происходит внутри выбрать снаружи? У меня есть очень большая таблица, с которой я могу легко получить запись с внешним запросом, но весь запрос в совокупности сократился.

Мой Linq запрос

var result = from i in invitationEntity.Invitations 
.Where(a=>a.id == inviationId) 
select i; 

Я использую SQL 2012 & EF5 & Linq.

Есть ли способ «заставить» более простой запрос?

+0

Мне очень любопытно узнать, что вы найдете. Я не знаю, почему EF делает это, но я немного удивлен тем, что оптимизатор запросов не создает тот же план для обоих. Является ли вид sql, который у вас здесь, очень упрощенным? Я попытался запустить это на некоторых таблицах и представлениях самостоятельно, и я получаю тот же план выполнения для обоих запросов. – Sethcran

+0

Вышеуказанное работает, если у вас есть <2 миллиона записей, но если у вас есть 29 миллионов, то оно подлежит таймаутам. Я упростил возвращаемые поля. Я начинаю думать, что это меньше EF и больше Linq для сущностей, которые являются виновниками. –

+0

- этот код сначала, db first, model first? – Fredou

ответ

5

Потому что вы снова вызываете «ВЫБРАТЬ» в конце вместе с методом LINQ.

var result = from i in invitationEntity.Invitations 
.Where(a=>a.id == inviationId) 
select i; 

В последней строке выберите Я, бесполезно, но EF не знает об этом, имеет ли он что-нибудь полезное или нет, вы можете просто избежать.

var result = invitationEntity.Invitations 
.Where(a=>a.id == inviationId); 

Вы все еще можете перечислить результат и получить все.

Ok извините, я забыл добавить, вы не должны использовать «от», вы можете просто использовать .гд (выражение)

И если вы хотите использовать LINQ ключевых слова, то вы можете использовать его таким образом,

var result = from i in invitationEntity.Invitations 
where i.id == invitationId 
select i; 

Вы не можете смешивать ключевые слова LINQ и методы расширения LINQ.

+0

Вы должны закончить тело запроса предложением select. Если есть другой способ, я хотел бы услышать об этом. –

+0

Вам также не нужно использовать из i, и у вас смешанные ключевые слова LINQ и методы LINQ. –

+0

Я выполнил запрос var result = Invitations.Where (i => i.id == "123456"); Result.Dump(); через LinqPad, и я получаю тот же SQL с вложенными выделениями. –

0

я бы сказал, что

var result = from i in invitationEntity.Invitations 
       .Where(a=>a.id == inviationId) 
       select i; 

это

a=>a.id == inviationId 

из a=> генерировать

Select myview.ID as ID, 
    myview.Name as Name 
    From myview 

так a является [extent1]

вы должны использовать «стандарт», где статья

  from i in invitationEntity.Invitations 
        where i.id == inviationId 
      select i; 
+0

Сгенерировал тот же самый SQL. –

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