2012-03-15 3 views
1

linqとエンティティクエリおよびriaサービスとの相互作用に関する一般的な質問があります。私は私のdomainconext内で私のアプリケーションのクエリを定義することができます知っている。たとえば、私のドメインコンテキスト内でlinqを使って次のクエリを定義することができます:Linq、EntityQuery、およびRIAサービスの相互作用の明確化

public IQueryable<User> GetUsersFriends(Guid usersID) 
    { 
     return (from f in this.ObjectContext.Friends join u in this.ObjectContext.Users on f.FriendUsersID equals u.ID where f.UsersID.Equals(usersID) select u); 
    } 

これはすべて良いです。しかし、私の質問は、クライアント側(silverlightアプリ)から同じ種類のクエリを実行できますか?ですから、EntityQueryオブジェクトに対してlinq文を作成し、この方法でデータベースからデータを返すことができますか?

私はが既にがロードされているエンティティのコレクションに対してlinq操作を実行できることを知っていますか?コレクションを読み込むためにクライアント側でlinqを使用できますか?

私は最終的にデータベースにヒットしたすべてのクエリを自分のドメインコンテキストで定義する必要があると考えていますか?癖のない私は新しいクエリを定義し、それらをdomaincontext.load()オペレーションに渡すためにlinqを使用しようとし続けます...これは悲惨に失敗します。 domainconextにはおそらく、行間でクエリをマーシャリングする方法はありません...そうですか?

私の理解は正しいですか?誰かが私のためにこれを確認するのに役立つなら、私はそれを感謝します。

答えて

2

IQueryableの主な利点の1つは、クライアント側でクエリを作成してサーブ上で処理するためにサーバーにシリアル化することができることです。ここでの要件は、定義されている型を返さなければならないということです(IQueryableの場合はUserがIEnumerable <をサポートするコレクションで返される必要がある型です)。

Shawn Wildermuth(wildermuth.com) )、そしてそれを少し微調整これは私が私のクライアント側で使用しているもの「モデル」である

publicvoid PerformQuery<T>(EntityQuery<T> qry, EventHandler<EntityResultsArgs<T>> evt, object pUserState = null, bool NoRecordsThrow = False, LoadBehavior pLoadBehavior = LoadBehavior.MergeIntoCurrent) where T : Entity 
{ 

    ModelDataContext.Load<T>(
    qry, 
    pLoadBehavior, 
    r => 
    { 

     if (evt != null) 
     { 
     try 
     { 

      if (r.HasError) 
      { 

#if DEBUG 

      System.Diagnostics.Debugger.Break(); 

#endif 
      //internal class to record error messages 
      AppMessages.ErrorMessage.Display(string.Concat(r.Error.Message, Environment.NewLine, "------------------------", "------- Stack Trace ------", Environment.NewLine, r.Error.StackTrace)); 
      } 
      else if (r.Entities.Count() > 0 || NoRecordsThrow) 
      evt(this, new EntityResultsArgs<T>(r.Entities, r.UserState)); 
     } 
     catch (Exception ex) 
     { 
#if DEBUG 
      System.Diagnostics.Debugger.Break(); 
#endif 
      evt(this, new EntityResultsArgs<T>(ex)); 
     } 
     } 
    }, 
    pUserState); 
} 

私は、このようにそれを使用した場合:。。欠点は、この経由ということです

var UserQuery = <DomainServiceName>.Users.Where(pUser => pUsers.City == "Calgary"); 
PerformQuery<User>(UserQuery, UserQueryComplete) 

1つのエンドポイント、ユーザーデータを抽出できますクライアント側で発行されたフィルタのいずれかの種類を持つD ....

HTH、 リチャード

+0

はあなたにリチャードをありがとうございます。これは私のために少しクリアします。私の最後に同様のことを試みたときに、すぐに意味をなさないタイプのエラーメッセージが表示されました。あなたの説明では、私は今、私の問題を解決したテンプレートロード(domaincontext.load )であることを理解しています。しかし、私は、データベースがヒットしたファッションを制御することについてのあなたの要点を知っています。そのため、今のところ明らかにしておき、すべてをドメインコンテキストに入れてください。私はセキュリティに関するあなたのコメントを理解していませんでした。あなたはそれを説明できますか?ちょうど私自身の啓発のため。 –

+0

エンドポイントがIQueryableとして公開されている場合は、任意の種類のフィルタ、ソート句などを使用してそのエンティティから情報を取得できます。ユーザーがクエリを作成し、そのクエリをエンドポイントに渡して情報を取得できるようにします。これは、追加情報を「含む」、または遅延読み込みを許可すると、より危険になります。どちらも、エンティティから始めて、データスキーマにナビゲートして追加情報を取得できることを意味します。覚えておいてください。これはIIS経由で公開されているものです.IISが公開されている場合は、このエントリポイントも公開されます。セキュリティは問題です。 – codeputer

関連する問題