在以下示例中,我们将一个名为taskinstance的实体插入到我们的上下文中。我们有一个我们设置为2的外键FK_Contract。
entity.FK_Contract = 2;
context.TaskInstances.AddObject(entity);
实体框架生成的查询是一个简单的插入。 (一切都很好)
但是,以下查询的工作方式不同。
int contractId = context.Contracts.Where((T) => T.Name == contractName).Single().Id;
entity.FK_Contract = contractId;
context.TaskInstances.AddObject(entity);
在实体框架创建的跟踪中,我们毫不奇怪地看到根据contractName选择Id的查询,但我们还看到了一个额外的请求,如下所示:
select id,... from [TaskInstances] WHERE [Extent1].[FK_Task] = @contractId
这个额外的查询会导致许多问题,尤其是当我们使用具有数百万条记录的外表时。网络瘫痪了!
因此,我们希望找出此额外查询的目的以及使其消失的方式。
答案 0 :(得分:0)
看起来额外的查询正在填充返回的Contract
对象上的任务集合。尝试只投射您想要的列:
int contractId = context.Contracts
.Where(T => T.Name == contractName)
.Select(T => T.Id)
.Single();