1

「コードのみ」(SQL Server 2008) で Entity Framework CTP 5 を使用しています。DbContext から返されたエンティティがあり、それから子コレクションにアクセスし、そこから 1 つの項目を選択します。これが私のLINQステートメントです:

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 は私のデータベースのビット フィールドです。

これがなぜなのか説明できる人はいますか?パフォーマンスに大きな影響を与えています。

4

2 に答える 2

4

これは、すべての EF 実装の仕様によるものです。質問集は公開してIEnumerable<Question>いませんIQueryable<Question>。Questions プロパティにアクセスすると、遅延読み込みがトリガーされ、関連するすべての質問が読み込まれます。SingleOrDefault次に、ロードされたコレクションを呼び出します。

単一の質問だけが必要な場合は、代わりに次のクエリを実行します。

var question = context.Questions
                 .SingleOrDefault(q => q.Session.Id == sessionId && q.IsCurrent);
于 2011-03-01T12:55:43.420 に答える
2

子コレクション ( ) が完全currentTopic.Questionsに遅延ロードされ、コレクションに対して LINQ to Entities ではなく、SingleOrDefault の LINQ to Object バージョンが呼び出されるためだと思います。

投稿した SQL ステートメントには が含まれていますWHERE [Extent1].[SessionId] = 24。これは、currentTopic のすべての質問を読み込んでいることを示しています。

于 2011-03-01T12:56:11.847 に答える