2014-11-05 64 views
1

我先使用实体​​框架6.x数据库和SQL Azure数据库。实体框架数据库首先聚集列与渴望加载

我有一个数据库表研究和一个单独的表受访者。在我的EF设计师中,我有一个研究实体和受访者实体,而研究实体有一个受访者导航属性。每项研究都可以有数千名受访者,并且有数百项研究。

我的问题是,我试图在包含受访者COUNT的研究表上创建一个计算列,我试图加载这个值。我需要急切加载的原因是因为我正在使用研究列表填充DataGrid(WPF),并且我的网格中的一列是RespondentCount。如果我不急于加载这个值,那么当用户滚动网格时,我的数据网格上的滚动会变得很糟糕,因为RespondentCounts是延迟加载的。

我可以肯定渴望加载所有使用此语句受访者:

ctx.Studies.Include(s => s.Respondents) 

,然后做的受访者导航属性.Count之间的(),但是我会加载每个研究成千上万的受访者是巨大的性能和大量的内存浪费,因为我需要的只是COUNT。

我真正需要的是:

ctx.Studies.Include(s => s.Respondents.Count) 

但是,这是行不通的。

我试着设置一个数据库视图,其中包含一个简单的计算字段为RespondentCount的研究表,但在实体框架中只读,并且当我带上视图时,我失去了研究表上的所有其他外键关系进入EF设计师。

我怎样才能得到这个总值急切加载,而不必加载所有的受访者?

回答

2

步骤:

  1. 创建,通过研究计数受访SQL用户定义的函数。
  2. Studies表中创建一个计算列以使用该新函数。
  3. 在您的EF映射中,添加新的计算列,并使用参数DatabaseGeneratedOption.Computed设置HasDatabaseGeneratedOption属性。

用我自己的测试表

create table respondents (id int, study_id int) 

create function dbo.CountRespondents (@id int) 
    returns int 
as 
begin 
    return (select count(1) from respondents where study_id = @id) 
END 

create table studies (id int, name varchar(50), respondents as dbo.CountRespondents(id)) 

insert into respondents values (1, 1) 
insert into respondents values (2, 1) 
insert into respondents values (3, 1) 
insert into respondents values (4, 2) 
insert into respondents values (5, 2) 

insert into studies values (1, 'Study 1') 
insert into studies values (2, 'Study 2') 

select * from studies 

EF代码

ctx.Studies.Property(s => s.Respondents).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 

相反的Include,使用Property一些潜在的代码。

由于我不知道音量 - 我没有用我写的SQL实际测试EF部分,所以我不能真正说出它是否足够满足您的性能。但我会想象它应该工作正常。

+0

太棒了!每天学些新东西。谢谢! – 2014-11-05 23:45:10

0

http://msdn.microsoft.com/en-us/data/jj574232.aspx

有时是有用知道有多少实体,而不实际承担加载所有这些实体的成本都与数据库中的另一个实体。具有LINQ计数方法的查询方法可用于执行此操作。例如:

using (var context = new BloggingContext()) 
{ 
    var blog = context.Blogs.Find(1); 

    // Count how many posts the blog has 
    var postCount = context.Entry(blog) 
          .Collection(b => b.Posts) 
          .Query() 
          .Count(); 
} 
+0

但是,这似乎并没有解决急切加载的问题。当我加载研究表时,我需要知道研究表中每项研究的受访者人数。 – 2014-11-05 22:25:17