LINQ Fluent NHIBERNATE .Contains()在QueryOver <>中不起作用,但在Query <>中起作用

jax*_*xbo 19 nhibernate fluent-nhibernate linq-to-nhibernate

使用FNH,我尝试使用以下方法检索类别:

_session.QueryOver<Data.Model.Category>()
                                     .Where(c => tourCreateRequest.Categories.Contains(c.CategoryId))
                                     .List()
                                     .Select(_categoryMapper.CreateCategory)
                                     .ToList();
Run Code Online (Sandbox Code Playgroud)

但是我在.Contains()方法中遇到错误:

无法识别的方法调用:System.Collections.Generic.ICollection`1 [[System.Int64,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]:Boolean包含(Int64)

为什么我得到那个错误,出了什么问题?

我浏览了一些帖子,然后将查询更改为(下面),这适用于Query <>.

_session.Query<Data.Model.Category>()
                                     .Where(c => tourCreateRequest.Categories.Contains(c.CategoryId))
                                     .ToList()
                                     .Select(_categoryMapper.CreateCategory)
                                     .ToList();
Run Code Online (Sandbox Code Playgroud)

我认为QueryOver <>是最新的和最好的,应该使用而不是Query <>.

我使用如上所示的QueryOver <>的方式有什么问题?

jax*_*xbo 27

我找到了答案.感谢以下帖子:NHibernate使用带有WHERE IN的QueryOver

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

我不得不使用WhereRestrictionOn()


vig*_*ity 7

这是一个相切的问题,这似乎是最好的地方.

_session.Query<SomeType>.Where(t => someEnumerable.Contains(t))
Run Code Online (Sandbox Code Playgroud)

没有用.

在我的情况下someEnumerable不是List<SomeType>,而是一个HashSet<SomeType>.显然,NH真的希望它成为一个清单.所以,我这样做了,它起作用了.

var someEnumerableList = someEnumerable.ToList();
_session.Query<SomeType>.Where(t => someEnumerableList.Contains(t)
Run Code Online (Sandbox Code Playgroud)

此外,FWIW,我的印象Query<T>是新的首选方式,这QueryOver<T>是不太喜欢的方式,因为Query<T>返回IQueryable,意味着它应该更容易测试,理论上交换ORM.