Nhibernate标准:返回空列表

时间:2012-12-26 15:17:57

标签: c# nhibernate

有类似的结构 许可 - >财务 - > 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时,我会返回一个空列表。

我做错了什么?

1 个答案:

答案 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());