2011-03-16 13 views
0

私はちょっと、私はIQueryableを言うことができます返すリポジトリを持っている。このことのベストプラクティスやない...MVCコントローラアクションのLINQナビゲーションプロパティ?

でstugglingです。コントローラーでこれが正しく使用されていますか?

var whatever = ObjectRepository.GetWhatever(id); 
var videoId = whatever.UsersInObject1InObjects2.First().Object.Video.ExternalVideoId; 

上記の2行目の「.Object」と「.Video」は、「どのような」テーブルにも関連するテーブルへの参照です。

また、別のリポジトリで別の機能を使ってExternalVideoIdを取得する必要がありますか?

答えて

0

私が通常これを行う方法です。私は、コントローラがデータベースから必要とするデータをカプセル化する別のモデルクラスを作成します。 (私は原則としてORMクラスを使用しません)。これにより、私が必要とするかもしれないあらゆる種類の属性を持つモデルクラスメンバに注釈を付けることができます。リポジトリコードでは、私はORMを照会し、結果としてモデルクラス(またはモデルのIQueryable/IEnumerbale)を返します。

Entity FrameworkなどのORMからIQueryableを返すことは推奨されていません。コントローラでモデルを慎重にしないと、バックエンドに対してクエリを実行するリスクがあるためです。 /ビュー。これは、EF IQueryableではまだ実行されていないクエリを表すためです。 IQueryableではなくIEnumerableを返すことで、クエリの実行がリポジトリクラスに限定されていることを確認できます。

ただし、IQueryableを返す方が便利な場合があります。たとえば、テーブルのページング/ソートのシナリオでは、ページ番号、並べ替え方向、ページサイズなどをIQueryableに適用してから実行することができます。私は、このロジックはリポジトリではなくコントローラにもっと属していると感じています。いくつかは反対するかもしれません。

+0

がsenseをMakes sqlするlinq useでき.. so like queryableのinterfaceをexposeする

public IQueryable<T> Get(IUser identity) { return Context.Set<T>(); } public IQueryable<IBindable> GetItem(IUser identity) { return Context.Set<T>().Cast<IBindable>(); } 

をwant? – Ryan

+0

私はこれを言っているわけではありませんが、これは良いアドバイスです=)パターンを適用する方法について異なる理解があるかもしれないということです。私の返答では、リポジトリのパターンを参照していますが、私は具体的に作業パターンの単位について言及していません。私があなたの質問に答えるとき、私はデータを書くよりむしろデータを取得することについてもっと考えたので、仕事のパターンの単位は私の心に来なかった。関係のないメモでは、今日、私はちょうどこれにリモートで接続されている興味深い記事に出会った:http://ayende.com/Blog/archive/2011/03/16/architecting-in-the-pit-of-doom -the-evils-of-the.aspx –

0

実際には、コレクションを使用してクエリを実行しています。 私はlinqクエリをよりよく見ている必要があると思います。 カスタムクエリをリポジトリに追加する必要はありません。 Youはjust so essentially yourがwork用patternのunitとrepository patternをuseするsaying、then youは

+0

他のランダムなインターフェイスを無視する –

関連する問題