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

时间:2014-09-05 12:07:10

标签: sql performance linq entity-framework iqueryable

我使用ASP.NET MVC 5和EF 6,代码优先。我有实体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
   });

使用MiniProfiler miniprofiler我看到为每个人生成了一个唯一的sql select语句 Bs的数量。假设我在A中有100个B,这就变慢了。

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

SELECT 
[Extent1].[Id] AS [Id], 
'more columns, omitted sql
FROM [dbo].[B] AS [Extent1]
WHERE [Extent1].[AId] = @EntityKeyValue1

我想我会得到这样的东西:

SELECT COUNT(*)
FROM [dbo].[B] AS [Extent1]
WHERE [Extent1].[AId] = @EntityKeyValue1

这不是缓存计数值的问题,而是在尽可能少生成sql选项的情况下优化视图模型的创建。 顺便说一句,我不想​​使用急切加载,因为A和B(在实际代码中)非常重量级。

我该怎么做?

0 个答案:

没有答案