多少不明確な場合はご容赦ください。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全体を調べましたが、このメソッドはどこにも見つかりません...
誰かが私を正しい方向に向けることができれば、おそらく少しの例か何かで、私は非常に素晴らしいでしょう.
ありがとうございました!