private void BuildWithSubquery()
        {
            var criteria       = (CriteriaImpl)MainQuery.UnderlyingCriteria;
            var session        = (SessionImpl)criteria.Session;
            var metaData       = session.SessionFactory.GetClassMetadata(typeof(TRoot));
            var idName         = metaData.IdentifierPropertyName; //TODO: multiple props
            var pe             = Expression.Parameter(typeof(TRoot));
            var idExprBody     = Expression.Property(pe, typeof(TRoot).GetProperty(idName));
            var expr           = Expression.Lambda(idExprBody, pe);
            var mainCloned     = MainQuery.Clone();
            var projectionList = new List <IProjection>();

            projectionList.Add(ExpressionProcessor.FindMemberProjection(expr.Body).AsProjection());
            mainCloned.UnderlyingCriteria.SetProjection(projectionList.ToArray());
            var tree = new QueryRelationTree();

            foreach (var pathExpr in Includes)
            {
                tree.AddNode(pathExpr);
            }
            foreach (var pair in tree.DeepFirstSearch())
            {
                var query = session.QueryOver <TRoot>();
                //Add a SubQuery
                query.And(Subqueries.PropertyIn(idName, ((QueryOver <TRoot, TRoot>)mainCloned).DetachedCriteria));
                CopyCriteriaValues(criteria, query);
                FillSubQuery(pair.Value, query, criteria);
                query.Future();
            }
        }
        private void BuildWithoutSubQuery()
        {
            var criteria = (CriteriaImpl)MainQuery.UnderlyingCriteria;
            var tree     = new QueryRelationTree();

            foreach (var pathExpr in Includes)
            {
                tree.AddNode(pathExpr);
            }
            foreach (var pair in tree.DeepFirstSearch())
            {
                var query = MainQuery.Clone();
                FillSubQuery(pair.Value, query, criteria);
                query.Future();
            }
        }