Sql 优化实体项目数到视图模型的投影

Sql 优化实体项目数到视图模型的投影,sql,performance,linq,entity-framework,iqueryable,Sql,Performance,Linq,Entity Framework,Iqueryable,我使用ASP.NETMVC5和EF6,代码优先的方法。我有实体A和B,其中A有B的集合 我想生成一组视图模型,如下所示: class ViewModelForA{ public int SomePropertyOfA {get;set}; public int BCount {get;set;} } dbCtx.A.Select(x=> new ViewModelForA { SomePropertyOfA = x.Prop, BCou

我使用ASP.NETMVC5和EF6,代码优先的方法。我有实体A和B,其中A有B的集合

我想生成一组视图模型,如下所示:

class ViewModelForA{
    public int SomePropertyOfA {get;set};
    public int BCount {get;set;}
}
dbCtx.A.Select(x=> 
   new ViewModelForA {
       SomePropertyOfA = x.Prop,
       BCount = x.Bs.Count()   //problem
   });
SELECT COUNT(*)
FROM [dbo].[B] AS [Extent1]
WHERE [Extent1].[AId] = @EntityKeyValue1
查询如下所示:

class ViewModelForA{
    public int SomePropertyOfA {get;set};
    public int BCount {get;set;}
}
dbCtx.A.Select(x=> 
   new ViewModelForA {
       SomePropertyOfA = x.Prop,
       BCount = x.Bs.Count()   //problem
   });
SELECT COUNT(*)
FROM [dbo].[B] AS [Extent1]
WHERE [Extent1].[AId] = @EntityKeyValue1
使用MiniProfiler,我看到为每个 B的计数。假设A中有100个B,这会变慢

这是从
x.Bs.Count()
生成的SQL:

我想我会得到这样的结果:

class ViewModelForA{
    public int SomePropertyOfA {get;set};
    public int BCount {get;set;}
}
dbCtx.A.Select(x=> 
   new ViewModelForA {
       SomePropertyOfA = x.Prop,
       BCount = x.Bs.Count()   //problem
   });
SELECT COUNT(*)
FROM [dbo].[B] AS [Extent1]
WHERE [Extent1].[AId] = @EntityKeyValue1
这不是缓存计数值的问题,而是优化viewmodels的创建,尽可能少地生成sql选择。 顺便说一句,我不想使用即时加载,因为A和B(在真正的代码中)是相当重的


我该怎么做

您将如何用SQL编写此查询?如果没有谓词,您总是要对a和B进行完整扫描,因此我不确定您想要什么类型的性能提升。此查询的查询计划是什么样子的?您使用的是什么版本的实体框架?(我刚刚用EF 5测试了这个场景,它生成了高效的SQL。)@SteveRuble你能把生成的高效SQL显示出来吗?
选择[Extent1]。[RedactedPK]为[RedactedPK],[Extent1]。[DataFoundMessage]为[DataFoundMessage],(从[dbo]。[RedactedDriver]为[Extent2]中选择计数(1)为[A1]。[Extent1]。[RedactedPK]=[Extent2][dbo].[RedactedFK]作为[C1]从[dbo].[Redacted]作为[Extent1]
@SteveRuble hmmm有趣。我使用ef6