1

Entity Framework и Linq-To-Entities действительно дают мне некоторые головные боли. У меня довольно простой запрос:Entity Framework. Любой не генерирует ожидаемое предложение SQL WHERE

var result = feed.FeedItems.Any(ei => ei.ServerId == "12345"); 

feed - это единственный объект EF, который я выбрал ранее в отдельном запросе из того же контекста.

Но сгенерированный SQL просто отбрасывает условие .Any и запрашивает все элементы FeedItems объекта фида, которые могут быть несколькими тысячами записей, что является пустой тратой сетевого диапазона. Кажется, фактическое сравнение .Any сделано в C#:

exec sp_executesql N'SELECT [t0].[Id], [t0].[FeedId], [t0].[ServerId], [t0].[Published], [t0].[Inserted], [t0].[Title], [t0].[Content], [t0].[Author], [t0].[WebUri], [t0].[CommentsUri] 
FROM [dbo].[FeedItem] AS [t0] 
WHERE [t0].[FeedId] = @p0',N'@p0 int',@p0=3 

Я также попытался:

!feed.FeedItems.Where(ei => ei.ServerId == "12345").Any(); 

Но это ничего не меняет. Даже удаление Any() и запрос для полного списка элементов не меняют запрос.

Я не понимаю ... почему это не работает так, как я ожидал бы? Там должно быть

WHERE ServerId == 1234 

статья в заявлении SQL.

Большое спасибо за любую помощь/разъяснения :)

+3

Что такое 'feed.FeedItems'? –

+0

Как упоминалось выше, подача запрашивается из DbContext перед таким feed.FeedItems является EntitySet

ответ

3

Как Николас уже заметил, выглядит запрос, выполненный в FeedItems собственности (возможно, вы возвращающегося List или IEnumerable) и весь список элементов, возвращаемых из базы данных. После этого вы подаете Any в коллекцию памяти. Вот почему вы не видите WHERE ServerId == 1234 в запросе SQL.

При применении Any к IQueryable сгенерированного запроса будет выглядеть следующим образом:

SELECT 
    (CASE 
     WHEN EXISTS(
      SELECT NULL AS [EMPTY] 
      [dbo].[FeedItem] AS [t0] 
      WHERE [t0].[ServerId] = @p0 
      ) THEN 1 
     ELSE 0 
    END) AS [value] 
+0

Теперь я получаю объект подачи из БД контекста, как это: Подача = db.Feeds.FirstOrDefault (е => f.Id == feedId); Так что feed.FeedItems будет EntitySet ... так что нормально работать, не так ли? –

+1

О, неважно ... EntitySet не IQueryable ... черт побери, это было неправильное предположение. Большое спасибо за ваш быстрый ответ! –

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