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();
    }
}

我想选择所有Table1s。我也想选择所有满足Table2一定条件的s (如果我想在 SQL 中执行此操作,我会执行以下操作:Table2.Field = 'value'Table1Table2

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

我应该如何构建我的 NHibernate 查询以达到预期的结果?我想要一个Table1s 列表,在每个列表中Table1我想要一个空的Table2s 列表(因为没有Table2s 符合条件),或者一个符合条件的Table2s 列表。

我正在尝试类似以下的方法,但这显然行不通:

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 加载完整的实体及其所有属性(如果没有激活延迟​​加载)。如果你保存了一个类型为 table1 的加载实体而没有所有 table2,hibernate 应该做什么?

您应该创建某种视图对象 (dvo),其中包含 table1 的相关部分和符合条件的 table2 子项列表。选择可以通过投影来完成。

于 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 回答