NHibernate,使用带有Future的QueryOver获取孙子集合

时间:2012-07-26 20:22:59

标签: c# nhibernate

我正在尝试检索父实体的所有集合(非笛卡儿产品),但无法弄清楚如何获取孙子。表结构如下:

enter image description here

以下代码获取我的父级及其Child1和Child2集合及其ParentChild3集合,但我不知道如何构造查询以获取Child3孙子(并将它们推迟到Future())。

var parent = _session
    .QueryOver<Parent>()
    .Where(x => x.Id == id)
    .Future<User>();

var children1 =_session
    .QueryOver<Parent>()
    .Where(x => x.Id == id)
    .Fetch(x => x.Children1).Eager
    .Future<Parent>();

var children2 =_session
    .QueryOver<Parent>()
    .Where(x => x.Id == id)
    .Fetch(x => x.Children2).Eager
    .Future<Parent>();

var parentChildren3 =_session
    .QueryOver<Parent>()
    .Where(x => x.Id == id)
    .Fetch(x => x.ParentChildren3).Eager
    .Future<Parent>();

// how to get children3, now?

return parent.SingleOrDefault();

半相关:这是获得所有收藏品的最佳方式吗?是否更好(并且可能)使用通过连接获得结果的查询?

2 个答案:

答案 0 :(得分:2)

如何获得Children3:

ParentChildren alias = null;
var parentChildren3 =_session
    .QueryOver<Parent>()
    .Where(x => x.Id == id)
    .JoinAlias(x => x.ParentChildren3, () => alias)
    .Fetch(() => alias.Children3).Eager
    .Future<Parent>();

半相关:这是我所知道的最佳方式。

如果ParentChild表没有其他列,那么您可以将其映射为标准manytomany。 NHibernate当时不需要实体用于链接表,并且更加容易获取。

答案 1 :(得分:2)

试试这个:

var parentChildren3 =
        _session
            .QueryOver<Parent>()
            .Fetch(x => x.ParentChildren3).Eager
            .Fetch(x => x.ParentChildren3.First().Child3).Eager
            .Where(x => x.Id == id)
            .Future<Parent>();

正如论坛帖子所述:https://groups.google.com/forum/?fromgroups=#!topic/nhusers/ER5BvVnCT5Q