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

相關問題