timothyclifford
timothyclifford

Reputation: 6959

NHibernate QueryOver can't query lazily loaded objects

I have the following NHibernate code:

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

However when it gets executed, returns the following exception message:

could not resolve property: Project.CompletedDate of: TaskManager.Framework.Model.SubProject

Do I have to use JoinQueryOver similar to this: Nhibernate Linq query to QueryOver

And if so, how do I join multiple objects from SubProject?

Thanks :) Tim

Upvotes: 0

Views: 425

Answers (2)

Diego Mijelshon
Diego Mijelshon

Reputation: 52725

You could use LINQ for that query instead of QueryOver (in fact, the tags you chose suggest this is what you actually wanted):

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

Upvotes: 1

LeftyX
LeftyX

Reputation: 35587

you get that error message cause Subproject entity doesn't load Project related entity.

Your statement should look something like this:

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

I am not sure about the relation between Project and Client but I guess a Project has always an associated Client and so it should a many-to-one with a fetch-join.

If you want to know more about joins and fetching I've replied to another user few weeks ago.

And here's an interesting article about the same topic.

Upvotes: 0

Related Questions