LINQ Fluent NHIBERNATE.Contains()在QueryOver中不起作用<&燃气轮机;但在查询中起作用<&燃气轮机;

LINQ Fluent NHIBERNATE.Contains()在QueryOver中不起作用<&燃气轮机;但在查询中起作用<&燃气轮机;,nhibernate,fluent-nhibernate,linq-to-nhibernate,Nhibernate,Fluent Nhibernate,Linq To Nhibernate,使用FNH,我尝试使用以下方法检索类别: _session.QueryOver<Data.Model.Category>() .Where(c => tourCreateRequest.Categories.Contains(c.CategoryId)) .List()

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

_session.QueryOver<Data.Model.Category>()
                                     .Where(c => tourCreateRequest.Categories.Contains(c.CategoryId))
                                     .List()
                                     .Select(_categoryMapper.CreateCategory)
                                     .ToList();
\u session.QueryOver()
.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]]:布尔包含(Int64)

为什么我会犯这样的错误,怎么了

我浏览了一些帖子,然后将我的查询改为(如下),这对查询有效

\u session.Query()
.Where(c=>tourCreateRequest.Categories.Contains(c.CategoryId))
托利斯先生()
.Select(_categoryMapper.CreateCategory)
.ToList();
我认为QueryOver是最新和最好的,应该使用它来代替Query


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

我找到了答案。多亏了以下网址:

var categories=\u session.QueryOver()
.WhereRestrictionOn(c=>c.CategoryId).IsIn(arrayofccategoryids)
.List()
.Select(_categoryMapper.CreateCategory)
.ToList();

我不得不使用WhereRestrictionOn()

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

_session.Query<SomeType>.Where(t => someEnumerable.Contains(t))
另外,FWIW,我的印象是,
Query
是新的首选方式,而
QueryOver
是不太受欢迎的方式,因为
Query
返回IQueryable,这意味着它应该更容易测试,理论上可以替换出ORM。

如下:

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

我想你需要先读一下,谢谢你的链接。但是,如何使用QueryOver使用.Contains()执行相同的操作?我更喜欢这个解决方案:@JacobBrewer,该解决方案不起作用,因为它只使用单个childId进行检查。需要IN子句。对
ToList()
的调用执行查询,即它会导致服务器往返返回所有
SomeType
类型的记录。我认为最好的选择是从服务器获取满足
Where()
子句的子集。似乎至少在简单的情况下是这样的:
session.Query().Where(f=>setOfIds.Contains(f.SomeId))
SomeId
的类型是
Guid
。我们使用的是NHibernate的5.1.0版。重要提示:并不是NHibernate“真的希望它成为一个列表”。HashSet不能按预期工作的根本原因是HashSet依赖于其所有子对象的
GetHashCode()
保持常量的结果。关键的是,当您实现NHibernate时,您通常会覆盖基本实体中的
Equals()
GetHashCode()
。。。结果是,当您保存实体并获取ID时,该实体的
GetHashCode()
值会发生变化,现在HashSet在自身中找不到它。列表不依赖于
GetHashCode()
,所以它可以工作。
_session.Query<SomeType>.Where(t => someEnumerable.Contains(t))
var someEnumerableList = someEnumerable.ToList();
_session.Query<SomeType>.Where(t => someEnumerableList.Contains(t)
    query = query.WhereRestrictionOn(x => x.DescricaoDoProduto.Homogenize()).IsInsensitiveLike
(filter.Description.Homogenize());