3

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

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

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

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

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

4

2 回答 2

0

RIA ObjectContext 操作 IQueryable。您可以从您的方法域服务方法返回 IQueryable,以允许通过表达式树序列化将客户端“linq 到客户端模型实体”转换为服务器端“linq 到实体/db”(默认为惰性)。您可以通过关闭 ' LazyLoadingEnabled' 来启用即时加载。

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

于 2013-03-11T15:13:43.137 回答
0

这是C#版本

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

当你写

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

它返回一个查询表上所有数据的 sql

但是第二个表达式不能转换为 ObjectQuery,所以它似乎是应用每个元素的谓词。好像不太好。

让我们剖析一下吧!当我分析此操作时,我看到正在执行的查询是

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

ID是我的查询(3)中的耐心ID。所以这个扩展方法首先转向SQL然后执行。所以它是安全的。首先转向SQL。然后枚举它。

您也可以使用 Where 扩展名。我总是喜欢 Where(p=p.patientID==3).FirstOrDefault()

于 2013-03-11T15:15:22.593 回答