我的Silverlight应用程序使用RIA Webservices与使用实体框架模型的DomainService
进行交互。
在服务中我有一些简单的东西:
Public Function GetCompanyByID(companyID As Integer) As Company
Return ObjectContext.Companies.FirstOrDefault(Function(c) c.ID = companyID)
End Function
我的问题是所有公司首先从数据库加载,然后用LINQ查询并发送给客户端?
我在问,因为数据库可能会增长,并且可能会引入公司实体中某些导航属性的急切加载。因此,首先加载所有公司可能需要很长时间。
答案 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()