web-dev-qa-db-ja.com

LINQ Fluent NHIBERNATE .Contains()はQueryOver <>では機能しませんが、Query <>では機能します

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 <>を使用する方法の問題は何ですか?

19
jaxxbo

私は答えを見つけました。投稿に感謝します: NHibernateがWHERE INでQueryOverを使用

var categories = _session.QueryOver<Data.Model.Category>()
                                     .WhereRestrictionOn(c => c.CategoryId).IsIn(ArrayofCategoryIds)
                                     .List()
                                     .Select(_categoryMapper.CreateCategory)
                                     .ToList();

WhereRestrictionOn()を使用する必要がありました

25
jaxxbo

これは接線方向に関連する問題であり、これを置くのに最適な場所のように思われました。

_session.Query<SomeType>.Where(t => someEnumerable.Contains(t))

動作していませんでした。

私の場合、someEnumerableList<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を交換できます。

7
viggity