2013-03-11 27 views
3

我的Silverlight應用程序使用RIA Webservices與使用實體框架模型的DomainService進行交互。在執行linq之前,DomainService是否加載所有實體?

在服務我喜歡簡單的東西:

Public Function GetCompanyByID(companyID As Integer) As Company 
    Return ObjectContext.Companies.FirstOrDefault(Function(c) c.ID = companyID) 
End Function 

我的問題是被所有的企業從數據庫加載第一,然後用LINQ查詢,發送到客戶端?

我在問,因爲數據庫可能會增長,並且可能會引入一些公司實體內某些導航屬性的急切加載。因此,首先加載所有公司可能需要很長時間。

回答

0

RIA ObjectContext操作IQueryable。您可以從您的方法域服務方法返回IQueryable,以允許通過表達式樹序列化將客戶端'linq到客戶端模型實體'轉換爲服務器端'linq到實體/數據庫'(默認爲懶惰)。你可以通過turning off 'LazyLoadingEnabled'進行急切的加載。

另請參閱關於Code-First in RIA (DbContext) - 這是如何完全支持/控制您選擇的ORM

0

這裏是C#版本

​​

當你寫

 (exp1 as System.Data.Objects.ObjectQuery).ToTraceString() 

它返回一個SQL quering 所有的數據放在桌子上

但第二個表達式不能被轉換爲ObjectQuery,所以它似乎應用每個元素的謂詞。這看起來不太好。

讓我們來分析一下吧!當我資料這個操作我看到正在執行的查詢是

"SELECT`Extent1`.`Id`, `Extent1`.`CitizenNo`,..some othre fields. 
    FROM `snv_patient` AS `Extent1` 
    WHERE `Extent1`.`Id` = 3 LIMIT 1" 

ID是patientID我的查詢(3)。所以這個擴展方法首先轉向SQL再執行。所以它的安全。首先轉到SQL。然後枚舉它。

您也可以使用Where擴展確保。我總是prefere哪裏(p = p.patientID == 3)。FirstOrDefault()

相關問題