3

私の Silverlight アプリケーションは、RIA Web サービスをDomainService使用して、Entity Framework モデルを使用する と対話します。

サービスには、次のような単純なものがあります。

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 to client model entities」をサーバー側の「linq to entities/db」(デフォルトでは遅延) に変換できるようにすることができます。'LazyLoadingEnabled' をオフにすることで、熱心な読み込みを有効にすることができます。

Code - First in RIA (DbContext)についても参照してください。これにより、選択した 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を返します

しかし、2番目の式は 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 に答える