21

使用 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<> 的方式有什么问题?

4

3 回答 3

32

我找到了答案。感谢帖子:NHibernate using QueryOver with WHERE IN

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

我不得不使用 WhereRestrictionOn()

于 2013-04-07T13:58:18.300 回答
8

这是切线相关的问题,这似乎是放置它的最佳位置。

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

没有工作。

在我的情况下someEnumerable不是 a List<SomeType>,而是 a HashSet<SomeType>。显然,NH 真的希望它成为一个列表。所以,我这样做了,它奏效了。

var someEnumerableList = someEnumerable.ToList();
_session.Query<SomeType>.Where(t => someEnumerableList.Contains(t)

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

于 2014-08-28T17:21:40.093 回答
-1

像这样:

    query = query.WhereRestrictionOn(x => x.DescricaoDoProduto.Homogenize()).IsInsensitiveLike
(filter.Description.Homogenize());
于 2019-09-30T01:00:24.950 回答