Sql 优化实体项目数到视图模型的投影
我使用ASP.NETMVC5和EF6,代码优先的方法。我有实体A和B,其中A有B的集合 我想生成一组视图模型,如下所示: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
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