LINQ Fluent NHIBERNATE.Contains()在QueryOver中不起作用<&燃气轮机;但在查询中起作用<&燃气轮机;
使用FNH,我尝试使用以下方法检索类别: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()
_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());