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番目のチャンクで実行すると、2と3があることがわかっているときに、空のリストが返されます。

私が間違っていることは何ですか?

4

1 に答える 1

2

私があなたのシナリオの正しさを理解しているなら、は機器IDinstrumentCriteriaのリストを返します。したがって、このリストでは、を制限する必要はありません。だからこれを試してみてください:queryCriteriafinancialCriteria

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

queryCriteria.Add(Subqueries.PropertyIn( "Id"、instrumentCriteria));の代わりに

そして、の結果(射影)は所有IDinstrumentCriteriaになるはずです:Financial

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

編集:

Instrument参照できる場合、Financialまたは少なくともプロパティがある場合、 FinancialIdAgencyによってフィルタリングされた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());
于 2012-12-26T15:43:46.860 に答える