2011-11-15 8 views
1

この質問は多くの質問をしていますが、私はそこで最もスマートなプログラマ(google)で明確な答えを見つけることができませんでした。 私はいくつかのリポジトリ(一般的なものではなく)を実装しましたが、エンティティごとに1つのリポジトリを実装しました。nhibernateと複数のリポジトリ(ウィンドウサービスの下で)を使用してデータベースクエリを実行する方法

public class Person 
{ 
    public string Name { get; set; } 
    public int Id { get; set; } 
} 

public class Product 
{ 
    public int ProductId { get; set; } 
} 

public class PersonRepository 
{ 
    ISession Session { get; set; } 

    public Person GetById(int id) 
    { 
     //... 
    } 

    public IEnumerable<Person> GetAll() 
    { 
     //... 
    } 

} 

public class ProductRepository 
{ 
    ISession Session { get; set; } 


    public Product GetById(int id) 
    { 
     //... 
    } 

    public IEnumerable<Product> GetAll() 
    { 
     //... 
    } 
} 

public class PostOfficeService 
{ 
    ProductRepository _rep1 = new ProductRepository(); 
    PersonRepository _rep2 = new PersonRepository(); 

    public IEnumerable<Person> GetAllPersonWithSameIdAsProduct() 
    { 
     _rep1.GetAll().Where(...) 
     // ??? i want it to perform the query in the DB and not two queries in app memory 
    } 
} 

私は作業パターンのパターンを使用しますか? そこには多くのデータと情報がありますが、私の指を正しいソリューション " "に置くことはできませんか、それとも良い解決策ですか?

答えて

1

作業単位パターンはトランザクションと関連しています。この問題との関係はわかりません。

GetAllPersonWithSameIdAsProductは、PersonRepositoryの1つの方法である必要があります。これは、リポジトリレベルを超えるとセッションにアクセスできないためです。もう1つの方法は、リポジトリにICriteriaのパラメータを受け入れるようにし、criteria-builderクラスを使用して複雑なクエリを作成することです。

LINQ-NHibernateを使用すると、IQueryableの実装がリポジトリになり、サービスクラスがデータベースと通信していることを知らなくてもLINQを使用してクエリを実行できるため、これらの問題を簡単に解決できます。

+0

私はちょうどそれについて読んだだけで、私はそれを勉強できるように、この種のコードを持つサンプルプロジェクトへのリンクがありますか? – guyl

+0

LINQ-NHibernateのサンプルプロジェクト? –

+0

http://stackoverflow.com/questions/624609/linq-to-nhibernate –

関連する問題