在执行linq之前,DomainService是否加载所有实体?

时间:2013-03-11 11:55:19

标签: .net vb.net wcf linq silverlight

我的Silverlight应用程序使用RIA Webservices与使用实体框架模型的DomainService进行交互。

在服务中我有一些简单的东西:

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

我的问题是所有公司首先从数据库加载,然后用LINQ查询并发送给客户端?

我在问,因为数据库可能会增长,并且可能会引入公司实体中某些导航属性的急切加载。因此,首先加载所有公司可能需要很长时间。

2 个答案:

答案 0 :(得分:0)

RIA ObjectContext运行IQueryable。您可以从方法域服务方法返回IQueryable,以允许客户端“linq到客户端模型实体”通过表达式树序列化转换为服务器端“linq to entities / db”(默认为lazy)。您可以通过turning off 'LazyLoadingEnabled'进行急切的加载。

另请参阅Code-First in RIA (DbContext) - 这是您完全支持/控制您选择ORM的方法

答案 1 :(得分:0)

这是C#版

        var exp1=this.ObjectContext.snv_patient;
        var expression = exp1.FirstOrDefault((item) => item.Id == patientID);

写作时

       (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 extension。我总是喜欢Where(p = p.patientID == 3).FirstOrDefault()