2011-02-24 48 views
1

我正在編寫一個RIA服務,它也使用SOAP公開。 它的一個方法需要從一個非常大的表中讀取數據。ObjectContext,實體和加載性能

在開始的時候,我做這樣的事情:

public IQueryable<MyItem> GetMyItems() 
{ 
    return this.ObjectContext.MyItems.Where(x => x.StartDate >= start && x.EndDate <= end); 
} 

但後來我停了下來,因爲我很擔心性能。

據我瞭解MyItemsis完全加載和「Where」只是過濾在屬性MyItems的第一次訪問加載的元素。由於MyItems將會有很多行,我認爲這不是正確的做法。

我試圖谷歌有點問題,但沒有有趣的結果出現。

所以,我想我可以在GetMyItems方法內部創建一個新的上下文實例,並有選擇地加載MyItems。例如:

public IQueryable<MyItems> GetMyItems(string Username, DateTime Start, DateTime End) 
    { 
     using (MyEntities ctx = new MyEntities()) 
     { 
      var objQuery = ctx.CreateQuery<MyItems>(
       "SELECT * FROM MyItems WHERE Username = @Username AND Timestamp >= @Start AND Timestamp <= @End", 
       new ObjectParameter("@Username", Username), 
       new ObjectParameter("@Start", Start), 
       new ObjectParameter("@End", End)); 

      return objQuery.AsQueryable(); 
     } 
    } 

但我不確定這是否是正確的方法。

您能否協助我並指出正確的做法?

在此先感謝, 乾杯, Gianluca。

回答

1

據我瞭解MyItemsis完全加載和「Where」只是過濾在屬性MyItems的第一次訪問加載的元素。

不,這是完全錯誤的。除非你真的擁有它們,否則不要修復「性能問題」。您已擁有的代碼可能比您建議替換的代碼執行得更好。它肯定不會像你所描述的那樣行事。但不要聽我的話。使用性能分析器。使用SQL Profiler。並測試!

+1

我會喜歡這個。我使用ToTraceString進行了檢查,我可以看到查詢是使用我提供的參數構建的,這使得我可以放心地解決可能的性能問題。謝謝克雷格! – 2011-02-24 15:49:44

+1

對於閱讀此帖子的其他人:我也發現了這個有趣的頁面:http://msdn.microsoft.com/en-us/library/cc853327.aspx。乾杯,G. – 2011-02-24 15:50:37