マップされたコレクションの結果セットを制限しようとしています。
簡単なモデルは次のとおりです。
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();
}
}
すべてを選択したいTable1
。Table2
また、特定の基準()を満たすすべてのを選択したいのTable2.Field = 'value'
ですが、自分のを制限したくないので、基準を満たさない場合はTable1
nullを選択します。Table2
SQLでこれを実行したい場合は、次のようにします。
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();