我正在尝试限制映射集合的结果集。
这是一个简单的模型:
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
s如果他们不符合标准。如果我想在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();
答案 0 :(得分:0)
我认为这样做是不可能的。 Hibernate加载整个实体及其所有属性(如果没有激活延迟加载)。 休眠应该做什么,如果你保存这种类型为table1的加载实体而没有所有table2的?
您应该创建某种viewobject(dvo),其中包含table1的相关部分和符合条件的table2子级列表。可以通过projection完成选择。
答案 1 :(得分: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
将返回符合条件的所有组合的集合。 (可以添加以后的顺序或不同或其他注意事项......)