この背後にあるデザインを正しく取得するのに問題があります。データレイヤーを管理するためにリポジトリ パターンを使用しています。私のコントローラー (MVC3) の 1 つで、結合を実行する必要がある LINQ クエリを作成しています。これについて 2 つの質問があります。
- すべての結合、プロジェクションなどを実行するメソッドをリポジトリに追加する方が良いですか? 私のリポジトリでコントラクト定義が増え続けることになるので、私はそれについて少し躊躇していますか?
- Post リポジトリに、すべてのアイテムを返す List() メソッドがあるとします。現在、ストア式に変換できないため、linq (結合) クエリでこのメソッドを使用することはできません。以下のコードは repo と呼ばれるクラスを使用していることに注意してください。このクラスは、同じコンテキスト インスタンスを使用してすべてのリポジトリ (投稿、友達) への参照を保持します。
大きな編集: 物事はもう少し明確になりましたが、誰かがここに飛び込んで、すべてを整理するのを手伝ってくれることを願っています;-)。私がやろうとしているのは、リポジトリ パターンと共に仕様パターンを実装することです。問題は、私は POCO を使用しており、私のリポジトリは IObjectSets を使用する IContext インターフェイスを使用していることです。したがって、以下の list メソッドでは、Posts は IObjectSet であり、Context は IContext インターフェースであり、実際のコンテキストを挿入します。
私は読んでいて、 implementing-repository-pattern-with-ef4-poco-supportやimplementing-repository-pattern-with-entity-frameworkなど、すぐに使用できる非常に優れたコードがいくつかあります。
これらの例はどちらも、リポジトリで objectContext を使用しています。それも抽象化したほうがいいのではないですか?
私のリポジトリ:
public System.Linq.IQueryable<Post> List()
{
return this.context.Posts;
}
そして、私のコントローラーメソッドでは:
var friendquestions = (from q in base._repo.Post.List().OfType<Question>()
from f in _repo.Friends.List()
where f.userId == myid
where q.Author == f.friendId
select q.Id).ToArray();
ただし、以下は機能します(なぜですか?):
var temp = (from q in base._repo.Post.List().OfType<Question>()
where q.Id > 6
select q.Id).ToArray();
基本的には、ここで説明されている問題と同じです: linq-to-entities-does-not-recognize-the-method
これを回避するにはどうすればよいですか?モデルで定義された関数について調べてきましたが、それが正しい方法かどうかわかりません。
前もって感謝します