Closed
Description
Having mapped list collection with composite-element
its not possible to use parent
property in query.
Domain:
public class Parent
{
public virtual int ParentId { get; set; }
public virtual IList<Child> Children { get; set; }
}
public class Child
{
public virtual Parent ParentLink { get; set; }
}
Mapping:
mapper.Class<Parent>(rc => {
rc.Id(x => x.ParentId, m => m.Generator(Generators.HighLow));
rc.List(
x => x.Children,
listMap =>
{
listMap.Table("Children");
listMap.Index(index => index.Column("Position"));
listMap.Key(keyMap => { keyMap.Column(
clm =>
{
clm.Name("ParentId");
});
});
listMap.Lazy(CollectionLazy.Lazy);
listMap.Cascade(Mapping.ByCode.Cascade.All | Mapping.ByCode.Cascade.All);
listMap.Inverse(true);
},
rel => { rel.Component(cmp => { cmp.Parent(x => x.ParentLink); }); }
);
});
query:
var result = (from p in session.Query<Parent>().SelectMany(x => x.Children)
select p.ParentLink.ParentId).ToList();
Expected result: query returns list of ParentIds
that have any Children
Actual result: query fails with exception
Hibernate.QueryException : could not resolve property: ParentLink of: component[] [.Select[NHibernate.Test.NHSpecificTest.GH1583.Child, NHibernate.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null,System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089](.SelectMany[NHibernate.Test.NHSpecificTest.GH1583.Parent, NHibernate.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null,NHibernate.Test.NHSpecificTest.GH1583.Child, NHibernate.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null](NHibernate.Linq.NhQueryable`1[NHibernate.Test.NHSpecificTest.GH1583.Parent], Quote((x, ) => (x.Children)), ), Quote((p, ) => (p.ParentLink.ParentId)), )]
at NHibernate.Persister.Entity.AbstractPropertyMapping.ToType(String propertyName)
at NHibernate.Hql.Ast.ANTLR.Tree.FromElementType.GetPropertyType(String propertyName, String propertyPath)
at NHibernate.Hql.Ast.ANTLR.Tree.DotNode.GetDataType()
at NHibernate.Hql.Ast.ANTLR.Tree.DotNode.Resolve(Boolean generateJoin, Boolean implicitJoin, String classAlias, IASTNode parent)
at NHibernate.Hql.Ast.ANTLR.Tree.DotNode.ResolveFirstChild()
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.propertyRefPath()
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.propertyRef()
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.selectExpr()
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.selectExprList()
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.selectClause()
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.unionedQuery()
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.query()
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.selectStatement()
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.statement()
at NHibernate.Hql.Ast.ANTLR.HqlSqlTranslator.Translate()
at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Analyze(String collectionRole)
at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.DoCompile(IDictionary`2 replacements, Boolean shallow, String collectionRole)
at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode ast, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
at NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query)
at NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
at NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression)
...