1

我正在使用Entity Framework CTP 5和「僅限代碼」(使用SQL Server 2008)。我有一個從DbContext返回的實體,然後我從中訪問一個子集合,並從中選擇一個項目。這裏是我的LINQ聲明:爲什麼Entity Framework不會在使用SingleOrDefault時生成的SQL中添加「where」?

Question currentQuestion = currentTopic.Questions.SingleOrDefault(x => x.IsCurrent); 

這將產生以下SQL:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[CreatedAt] AS [CreatedAt], 
[Extent1].[IsCurrent] AS [IsCurrent], 
[Extent1].[Xml] AS [Xml], 
[Extent1].[TopicId] AS [TopicId] 
FROM [dbo].[Questions] AS [Extent1] 
WHERE [Extent1].[SessionId] = 24 

我 「IsCurrent」 限購不被引用的。 IsCurrent是我的數據庫中的一個位域。

任何人都可以解釋爲什麼這是?這造成了巨大的業績。

+0

不確定... x => x.IsCurrent == true – rene 2011-03-01 12:50:41

回答

4

這是所有EF實現中的設計。問題集合公開IEnumerable<Question>而不是IQueryable<Question>。當您訪問Questions屬性時,會觸發延遲加載並加載所有相關問題。然後你在加載的集合上調用SingleOrDefault

如果你只想一個問題運行此查詢,而不是:

var question = context.Questions 
       .SingleOrDefault(q => q.Session.Id == sessionId && q.IsCurrent); 
2

我想是因爲孩子集合(currentTopic.Questions)被延遲加載完全然後LINQ到對象的SingleOrDefault的版本,而不是LINQ實體在您的收藏中被調用。

您發佈的SQL語句包含WHERE [Extent1].[SessionId] = 24。這表明它正在爲您的currentTopic加載所有問題。

相關問題