linqを持つnhibernate(述語?)
-
28-10-2019 - |
質問
私がやや不明なら私を許してください、私はちょうど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 Tableからすべての行を返します。
しかし、今私がやりたいのは、述語を追加することです。
IList<Person> daves = myRepository.All().Where(p => p.Name == "Dave").ToList();
これは正常に機能しますが、もちろん何が起こるかということです。Nhibernateは最初にデータベースを照会してすべての行を返し、Linqが結果をフィルタリングして、名前が「Dave」という名前のみを返します。
私はインターネット中を見ていましたが、これを実装する方法を見つけていません。また、時代遅れのように見える多くのことを見つけました。私のdll全体で見て、この方法はどこにも見つかりません...
誰かが私を正しい方向に向けることができれば、たぶんちょっとした例か何かで、私はとても素晴らしいでしょう。
どうもありがとうございました!
解決
それは非常に簡単です:
使用する session.Query<T>()
:
public virtual IQueryable<T> All()
{
return Session.Query<T>();
}
Query<T>
名前空間に存在する拡張メソッドです NHibernate.Linq
.
session.Linq
もはやサポートされていません。それはバージョン3より前のNhibernateのLINQプロバイダーであり、に置き換えられました Query<T>
.