1

私はEntity Framework CTP 5を「コードのみ」(SQL Server 2008)で使用しています。私はDbContextから返されたエンティティを持っていますが、そこから子コレクションにアクセスし、そこから1つの項目を選択します。ここに私のLINQ文はです:なぜSingleOrDefaultを使用すると、生成されたSQLに「どこ」が追加されないのですか?

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

答えて

4

これは、すべてのEF実装で設計されています。質問集はIEnumerable<Question>ではなく、IQueryable<Question>です。質問プロパティにアクセスすると、遅延ロードがトリガーされ、関連するすべての質問がロードされます。その後、ロードされたコレクションのSingleOrDefaultに電話します。

あなただけの単一の質問ではなく、このクエリを実行する場合:子コレクション(currentTopic.Questions)はなまけ完全がロードされているので、私は思う

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

をして、LINQはSingleOrDefaultのバージョンをObjectにしていないLINQエンティティへのアクセスは、あなたのコレクションに対して呼び出されます。

投稿したSQL文には、WHERE [Extent1].[SessionId] = 24が含まれています。それはあなたのcurrentTopicのすべての質問をロードしていることを示しています。

関連する問題