2013-03-11 28 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()

相关问题