3

多少不明確な場合はご容赦ください。NHibernate/LINQ/Lambda 式を使い始めたばかりで、何を探すべきか実際にはわかりません...

私は過去 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 session.Linq() メソッドの呼び出しをよく見ました。私のDLL全体を調べましたが、このメソッドはどこにも見つかりません...

誰かが私を正しい方向に向けることができれば、おそらく少しの例か何かで、私は非常に素晴らしいでしょう.

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

4

2 に答える 2

7

それは非常に簡単です:

使用session.Query<T>():

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

Query<T>名前空間に存在する拡張メソッドですNHibernate.Linq

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

于 2012-02-21T15:48:51.763 に答える
0

リポジトリで仕様パターンを使用することを検討することをお勧めします。NHibernate 3.0 Cookbook には、NHibernate を使用した実装の例があり、入手する価値のある優れたリソースです。

于 2012-02-21T15:47:23.620 に答える