【问题标题】:NHibernate, QueryOver returning list with list propertyNHibernate,QueryOver 返回列表与列表属性
【发布时间】:2018-10-30 15:18:08
【问题描述】:

我有这样的课程:

public class A : BaseTableFields
{
    public virtual string Name { get; set; }
    public virtual IList<B> propB { get; set; }
}

public class B : BaseTableFields
{
    public virtual A propA { get; set; }
    public virtual IList<C> propC { get; set; }
}

public class C : BaseTableFields
{
    public virtual B propB { get; set; }
    public virtual IList<D> propD { get; set; }
}

所以我的每个班级都与下面的班级有一对多的关系。 如何编写最有效的查询,我收到类型 A 的列表 (List listOfA),其中包含 listOfA.propB 中的记录,以及 listOfA.propB 中包含 listOfA.propB.propC 中的所有引用记录等等。

请帮忙。

让我们首先假设:

var list = Session.QueryOver<A>().Where(x=>x.Name == "test").List().ToList();

返回包含 3 个 A 类型元素的列表,但其属性 propB 为空。

【问题讨论】:

    标签: c# nhibernate


    【解决方案1】:

    我建议在 NHibernate LINQ 提供程序中使用“Fetch”或“FetchMany”函数。 this article 中的示例说明了它的实际作用,并显示了它将生成的 SQL。

    处理您的示例,结果如下:

    var list = Session.QueryOver<A>()
                      .Where(x => x.Name == "test")
                      .FetchMany(x => x.propB)
                      .ThenFetchMany(x => x.propC)
                      .ToList();
    

    如果这仍然给您带来问题,那么您的实体的一对多关系之间的映射文件可能存在问题。

    【讨论】:

    • 我在映射中发现了错误,但您的回答也对我有所帮助。如果您将 QueryOver() 替换为 Query() 并删除 List() 方法,它会起作用,因为 NHibernate LINQ 不支持此功能,只需 ToList() 就足够了:) 谢谢您的评论。
    • 很高兴我能帮上忙——即使一件小事不正确,映射通常也会给我和我的同事带来最多的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多