1

我正在使用带有“仅代码”的实体框架 CTP 5(使用 SQL Server 2008)。我有一个从 DbContext 返回的实体,然后我从中访问一个子集合,并从中选择一个项目。这是我的 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子集合(

您发布的 SQL 语句包含WHERE [Extent1].[SessionId] = 24. 这表明它正在为您的 currentTopic 加载所有问题。

于 2011-03-01T12:56:11.847 回答