有类似的结构
许可 - >财务 - > ICollection instrumentList
仪器 - >机构
也就是说,Permit的实例包含Financial的实例
Financial的一个实例有一组Instrument对象
仪器的一个实例有一个代理
使用NHibernate Critieria,我想获得一份特定类型机构的工具许可证清单 此代码获取所有带有财务信息的许可证(可能是许可证没有财务信息,在这种情况下我不需要它)
// get all all Permits with Financial info
var financialCriteria = DetachedCriteria.For<Financial>()
.SetProjection(Projections.Property("Permit.Id")); // Permit.Id in Select
queryCriteria.Add(Subqueries.PropertyIn("Id", financialCriteria)); // Permit.Id in Select
然后我想将该列表限制为类型2&amp;的代理商。 3:
// then restrict to certain Agency types
var instrumentCriteria = DetachedCriteria.For<Instrument>()
.SetProjection(Projections.Property("Id")) // Instrument.Id in Select
.Add(Restrictions.In("Agency", new object[] { 2, 3})); // Where
queryCriteria.Add(Subqueries.PropertyIn("Id", instrumentCriteria)); //
但是,当使用第二块代码运行时,当我知道有2和3时,我会返回一个空列表。
我做错了什么?
答案 0 :(得分:2)
如果我确实了解您的方案相关性,那么instrumentCriteria
会返回工具 ID 列表。因此,对于此列表,我们不应限制queryCriteria
,而应限制financialCriteria
。所以试试这个:
financialCriteria.Add(Subqueries.PropertyIn("Id", instrumentCriteria));
而不是 queryCriteria.Add(Subqueries.PropertyIn(“Id”,instrumentCriteria));
instrumentCriteria
的结果(投影)应该是拥有Financial
ID:
var instrumentCriteria = DetachedCriteria.For<Instrument>()
.SetProjection(Projections.Property("Financial.Id")) // owner ID
编辑:
如果Instrument
可以引用Financial
,或者至少有属性FinancialId
,则返回Permit的语法将按以下方式过滤:
var instrumentCriteria = DetachedCriteria.For<Instrument>()
// I. Financial as a reference
.SetProjection(Projections.Property("Financial.ID"))
// II. or just a int property FinancialId
// .SetProjection(Projections.Property("FinancialId"))
.Add(Restrictions.In("Agency.ID", new object[] { 2, 3 })); // Where
var financialCriteria = DetachedCriteria.For<Financial>()
.SetProjection(Projections.Property("ID")) // the ID of instrument
.Add(Subqueries.PropertyIn("ID", instrumentCriteria));
var queryCriteria = session.CreateCriteria<Permit>()
.Add(Subqueries.PropertyIn("Financial.ID", financialCriteria));
var result = queryCriteria.List<Permit>();
Assert.IsTrue(result.Any());