FNHを使用して、次を使用してカテゴリを取得しようとしています。
_session.QueryOver<Data.Model.Category>()
.Where(c => tourCreateRequest.Categories.Contains(c.CategoryId))
.List()
.Select(_categoryMapper.CreateCategory)
.ToList();
しかし、。Contains()メソッドでエラーが発生します:
認識されないメソッド呼び出し:System.Collections.Generic.ICollection`1 [[System.Int64、mscorlib、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]]:Boolean contains(Int64)
なぜそのエラーが発生するのですか、何が問題なのですか?
いくつかの投稿を確認してから、クエリを(以下)に変更しました。これはQuery <>で機能します。
_session.Query<Data.Model.Category>()
.Where(c => tourCreateRequest.Categories.Contains(c.CategoryId))
.ToList()
.Select(_categoryMapper.CreateCategory)
.ToList();
QueryOver <>は最新かつ最高であり、Query <>の代わりに使用する必要があると思いました。
上記のようにQueryOver <>を使用する方法の問題は何ですか?
私は答えを見つけました。投稿に感謝します: NHibernateがWHERE INでQueryOverを使用
var categories = _session.QueryOver<Data.Model.Category>()
.WhereRestrictionOn(c => c.CategoryId).IsIn(ArrayofCategoryIds)
.List()
.Select(_categoryMapper.CreateCategory)
.ToList();
WhereRestrictionOn()を使用する必要がありました
これは接線方向に関連する問題であり、これを置くのに最適な場所のように思われました。
_session.Query<SomeType>.Where(t => someEnumerable.Contains(t))
動作していませんでした。
私の場合、someEnumerable
はList<SomeType>
ではなく、HashSet<SomeType>
でした。どうやら、NHは本当にそれがリストであることを望んでいます。だから、私は代わりにこれをしました、そしてそれは働きました。
var someEnumerableList = someEnumerable.ToList();
_session.Query<SomeType>.Where(t => someEnumerableList.Contains(t)
また、FWIWは、Query<T>
が新しい好ましい方法であり、QueryOver<T>
がIQueryableを返すため、Query<T>
はあまり好ましくない方法であるという印象を受けました。つまり、テストが少し簡単になり、理論的にはORMを交換できます。