簡體   English   中英

在不限制父實體的情況下限制子實體-NHibernate

[英]Limit child entities without limiting parent entities - 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.Field = 'value' )的Table2 ,但是我不想限制我的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();

我認為這是不可能的。 Hibernate加載具有其所有屬性的完整實體(如果未激活惰性加載)。 如果您保存了一個沒有所有table2的table1類型的已加載實體,hibernate應該怎么做?

您應該創建某種類型的viewobject(dvo),其中包含table1的相關部分以及符合條件的table2子項列表。 選擇可以通過投影來完成。

有相當不錯的文檔-16.4。 社團協會

http://nhibernate.info/doc/nh/zh-CN/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將返回所有符合條件的組合的集合。 (可以添加以后的順序,也可以添加其他順序...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM