0

マップされたコレクションの結果セットを制限しようとしています。

簡単なモデルは次のとおりです。

public class Table1 {
    public virtual long Id { get; set; }
    public virtual IList<Table2> Table2s { get; set; }
}


public class Table2 {
    public virtual long Id { get; set; }
    public virtual long Table1Id { get; set; }
    public virtual Table1 Table1 { get; set; }
    public virtual string Field { get; set; }
}

public class Table1Map : ClassMap<Table1> {
    public Table1Map () {
        Table("Table1");
        Id(x => x.Id).Column("Id").Not.Nullable().CustomType("Int64").GeneratedBy.Native();
        HasMany<Table2>(x => x.Table2s).Inverse().Not.LazyLoad().KeyColumns.Add("Table1Id").Fetch.Join();
    }
}

public class Table2Map : ClassMap<Table2> {
    public Table2Map () {
        Table("Table2");
        Id(x => x.Id).Column("Id").Not.Nullable().CustomType("Int64").GeneratedBy.Native();
        Map(x => x.Table1Id).Column("Table1Id").Not.Nullable().CustomType("Int64");
        Map(x => x.Field).Column("Field").Not.Nullable().CustomType("AnsiString").Length(25);
        References<Table1>(x => x.Table1, "Table1Id").Cascade.None();
    }
}

すべてを選択したいTable1Table2また、特定の基準()を満たすすべてのを選択したいのTable2.Field = 'value'ですが、自分のを制限したくないので、基準を満たさない場合はTable1nullを選択します。Table2SQLでこれを実行したい場合は、次のようにします。

SELECT *
FROM 
Table1
LEFT OUTER JOIN Table2 ON Table1.Id = Table2.Table1Id
WHERE
Table2.Field = 'value' or Table2.Field IS NULL

目的の結果を達成するには、NHibernateクエリをどのように構成する必要がありますか?のリストが欲しいのですが、Table1それぞれのTable1中に、空のリストTable2(基準を満たしたものがないためTable2)、または基準を満たしたリストのいずれかTable2が必要です。

私は次のようなことを試みていますが、これは明らかに機能しません:

List<Table1> result = new List<Table1>();
IQueryable<Table1> query = session.Query<Table1>();
if (value != null) {
    query = query.Where(x => x.Table2s.Field == value);
}
query = query.OrderBy(x => x.Id);
result = query.ToList();
4

2 に答える 2

0

私はあなたがこれをする方法ではこれは不可能だと思います。Hibernateは、エンティティ全体とそのすべてのプロパティをロードします(lazyloadingがアクティブ化されていない場合)。すべてのtable2なしで、タイプtable1のそのようなロードされたエンティティを保存する場合、休止状態は何をすべきですか?

table1の関連部分と、条件に適合するtable2の子のリストを含むある種のviewobject(dvo)を作成する必要があります。選択は、投影によって行うことができます。

于 2012-12-07T15:07:23.230 に答える
0

かなり良いドキュメントがあります-16.4。アソシエーション

http://nhibernate.info/doc/nh/en/index.html#queryqueryover-associations

構文は次のQueryOverようになります

IQueryOver<Table1, Table2> myQuery = 
  session.QueryOver<Table1>()
   .Left.JoinQueryOver<Table2>(t => t.Table2s)
     .Where(
       Restrictions.Or(
         Restrictions.On<Table2>((t2) => t2.ID).IsNull, 
         Restrictions.On<Table2>((t2) => t2.Field).IsLike("value")
         )
       );
var list = myQuery.List<Table1>();

次に、listは基準を満たすすべての組み合わせのコレクションを返します。(後で注文するか、個別のまたは他のオブジェクトを追加することができます...)

于 2012-12-07T15:27:18.953 に答える