我試圖限制結果集映射的集合。限制子實體不限制父實體 - NHibernate的
下面是一個簡單的模型:
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
s表示符合一定條件(Table2.Field = 'value'
),但我不希望限制我Table1
S,所以選擇空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
s,並且在每個Table1
中,我想要一個空列表Table2
s(因爲沒有Table2
s符合標準),或者列表符合該標識的Table2
s。
我試圖像下面,但這顯然是不行的:
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();
這是一個很好的答案,但一定程度限制。如果'Table1'不僅有'Table2'的集合,而且'Table3'也是你想要過濾的。所提供的方法僅適用於兩個實體。有更通用的方法嗎?還有另一種方法嗎?謝謝! – Michael
是的! ;)NHibernate Criteria API非常強大。你可以使用投影(選擇一些屬性,選擇distinct ... sum,avg),你可以加入任何......你可以在WHERE子句中過濾......任何東西。請看看文檔(http://nhforge.org/doc/nh/en/index.html#querycriteria)或Ayende的博客 –
你有一個工作的例子嗎?我沒有找到對我的例子特別有用的文檔。我試圖實現你的建議,忽略了現在的「表3」,並沒有得到任何結果。如果您有一個使用強大的Criteria API和多個映射集合的工作示例,那將非常有幫助! – Michael