NHibernate QueryOver无法查询延迟加载的对象

时间:2012-02-01 00:20:36

标签: linq nhibernate queryover

我有以下NHibernate代码:

return NHibernateHelper.Session.QueryOver<SubProject>()
.Where
(
    sp => sp.CompletedDate == null
        && sp.ImportanceFlag.FlagID != GlobalConstants.ImportanceFlagID_Blue
        && sp.Project.SalesStatus.StatusID != GlobalConstants.SalesStatusID_NotSet
        && sp.Project.ProjectID != Guid.Empty
)
.OrderBy(sp => sp.Project.Client.CompanyName).Asc
.ThenBy(sp => sp.Project.ProjectName).Asc
.ThenBy(sp => sp.SubProjectName).Asc
.List();

然而,当它被执行时,返回以下异常消息:

  

无法解析属性:Project.CompletedDate:   TaskManager.Framework.Model.SubProject

我是否必须使用与此类似的JoinQueryOver:Nhibernate Linq query to QueryOver

如果是这样,我如何从SubProject加入多个对象?

谢谢:) 添

2 个答案:

答案 0 :(得分:1)

您可以使用LINQ代替QueryOver(实际上,您选择的代码表明这是您真正想要的):

return NHibernateHelper.Session.Query<SubProject>()
.Where
(
    sp => sp.CompletedDate == null
        && sp.ImportanceFlag.FlagID != GlobalConstants.ImportanceFlagID_Blue
        && sp.Project.SalesStatus.StatusID != GlobalConstants.SalesStatusID_NotSet
        && sp.Project.ProjectID != Guid.Empty
)
.OrderBy(sp => sp.Project.Client.CompanyName)
.ThenBy(sp => sp.Project.ProjectName)
.ThenBy(sp => sp.SubProjectName)
.ToList();

答案 1 :(得分:0)

您收到该错误消息导致子项目实体未加载项目相关实体。

你的陈述应该是这样的:

Project project = null;

return NHibernateHelper.Session.QueryOver<SubProject>()
.Where
(
    sp => sp.CompletedDate == null
        && sp.ImportanceFlag.FlagID != GlobalConstants.ImportanceFlagID_Blue
)
.Inner.JoinAlias(sp => sp.Project, () => project)
.And(()=> project.SalesStatus.StatusID != GlobalConstants.SalesStatusID_NotSet
        && project.ProjectID != Guid.Empty
    )
.OrderBy(() => project.Client.CompanyName).Asc
.ThenBy(() => project.ProjectName).Asc
.ThenBy(sp => sp.SubProjectName).Asc
.List();

我不确定Project和Client之间的关系,但我猜一个Project总是一个关联的客户端,所以它应该是一个多对一的fetch-join。

如果您想在几周前了解更多关于加入和提取我replied给其他用户的信息。

这是关于同一主题的有趣article