1

有这样的类结构
Permit -> Financial ->ICollection instrumentList
Instrument -> Agency

也就是说,Permit 实例包含 Financial
实例 Financial 实例包含 Instrument 对象集合 Instrument
实例包含 Agency

使用 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 和 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 时,我会返回一个空列表。

我做错了什么?

4

1 回答 1

2

如果我确实了解您的情况,则instrumentCriteria返回 Instrument ID列表。所以有了这个列表,我们不应该限制queryCriteriafinancialCriteria. 所以试试这个:

financialCriteria.Add(Subqueries.PropertyIn("Id", instrumentCriteria)); 

而不是queryCriteria.Add(Subqueries.PropertyIn("Id", instrumentCriteria));

的结果(投影)instrumentCriteria应该是拥有的FinancialID:

var instrumentCriteria = DetachedCriteria.For<Instrument>()
    .SetProjection(Projections.Property("Financial.Id")) // owner ID

编辑:

如果它Instrument可以引用Financial,或者至少有属性FinancialId,返回 Permit 的语法,由 Agency 过滤将如下所示:

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());
于 2012-12-26T15:43:46.860 回答