2012-02-21 17 views
2

私はやや不明瞭だ場合、私はちょうどNHibernateは/ LINQ /ラムダ式を使い始める、と私は実際に何を探すべきかがわからないよ私を許してください...NHibernateは(述語?)

I私は過去4〜5年間.NET 2.0で作業していたため、自分で開発する機会がなかったので、新しい技術を学ぶようになりました。

私はリポジトリパターンを可能な限り使用しようとする個人的な小さなプロジェクトを開始しました。

私は、次のような状況で今の私:

  • MyProject.Core.dll:私は、すべてのビジネスロジックが含まれているとIRepository契約を設定し、このコアアセンブリを持っています。リポジトリの実際の実装は何も知らず、実行時にIoCを使って解決されるため、このコアdllはNHibernate dllの参照を持ちません。
  • MyProject.Data.NHibernate.dll:NHibernate dllのすべての必要な参照を持つリポジトリの実装がこのアセンブリに含まれています。

    public class GenericRepository<T> : IGenericRepository<T> where T : class 
    { 
        ... 
        public virtual IQueryable<T> All() 
        { 
         IList<T> entities = Session 
          .CreateCriteria(typeof(T)) 
          .List<T>(); 
         return entities.AsQueryable<T>(); 
        } 
        ... 
    } 
    

    は、だから私のコアのdllに私は私のリポジトリへの参照を取得し、ような何かを行うことができます:

私のリポジトリの実装は次のようになります動作するようです

IList<Person> people = myRepository.All().ToList(); 

データベースを照会して、Person表からすべての行を戻します。

しかし、今私がやりたいことは述語を追加します:

IList<Person> daves = myRepository.All().Where(p => p.Name == "Dave").ToList(); 

これはうまく動作しますが、もちろん何が起こるかはNHibernateのは、最初のすべての行を返すようにデータベースを照会して、LINQの結果をフィルタリングしていることです名前が「Dave」のものだけを返すようにします。

私はインターネット上のすべてを見てきましたが、これを実装する方法を見つけていませんでした。また、古くなっているように見える多くのものを見つけました。たとえば、NHセッションへの呼び出しを頻繁に見ました。 )メソッドを使用して、私はdllの全面を見渡しました。このメソッドはどこにも見つかりませんでした...

誰かがちょっとした例で、正しい方向に私を向けることができたら、私はとても素晴らしいでしょう。

ありがとうございました!

答えて

7

それは非常に簡単です:

使用session.Query<T>()

public virtual IQueryable<T> All() 
{ 
    return Session.Query<T>(); 
} 

Query<T>は、名前空間NHibernate.Linqに住んでいる拡張メソッドです。

session.Linqはサポートされなくなりました。バージョン3より前のNHibernateのLINQプロバイダで、Query<T>に置き換えられました。

+0

はい!できます!!ありがとうございました! :) – Seb

0

specification patternをリポジトリで使用してみるとよいでしょう。 NHibernate 3.0 CookbookによるNHibernate hereの実装の例があります。これは価値のある優れたリソースです。

+0

ああの例を見ることができますが、よさそうだ、私は、ルックのおかげを持っていますよ! – Seb

-1

あなたが、私はこのパターンを知っていないリポジトリの実装here