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

时间:2013-04-07 13:14:15

标签: nhibernate fluent-nhibernate linq-to-nhibernate

使用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,   版本= 4.0.0.0,文化=中立,   PublicKeyToken = b77a5c561934e089]]:Boolean包含(Int64)

为什么我会收到错误,出了什么问题?

我浏览了一些帖子,然后将查询更改为(下方),这与Query&lt;&gt;一起使用。

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

我认为QueryOver&lt;&gt;是最新的和最好的,应该使用而不是查询&lt;&gt;。

我使用QueryOver&lt;&gt;的方式有什么问题?如上所示?

3 个答案:

答案 0 :(得分:25)

我找到了答案。感谢帖子: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()

答案 1 :(得分:7)

这是一个与切向相关的问题,这似乎是最好的地方。

_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>是不太喜欢的方式,因为Query<T>返回IQueryable,意味着它应该更容易测试,理论上可以换掉ORM。

答案 2 :(得分:-1)

像这样:

    query = query.WhereRestrictionOn(x => x.DescricaoDoProduto.Homogenize()).IsInsensitiveLike
(filter.Description.Homogenize());