【问题标题】:Does a DomainService load all entities before executing linq?DomainService 在执行 linq 之前是否加载所有实体?
【发布时间】:2013-02-26 14:13:03
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: .net vb.net wcf linq silverlight


    【解决方案1】:

    这里是 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()

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-22
        • 1970-01-01
        • 2020-10-01
        • 2015-04-07
        • 1970-01-01
        • 2016-01-11
        • 2019-01-05
        相关资源
        最近更新 更多