コード例 #1
0
        protected static void AddClientSideEval(MethodInfo target, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
        {
            target = target.MakeGenericMethod(queryModelVisitor.CurrentEvaluationType.DataType);

            var parameter = Expression.Parameter(queryModelVisitor.PreviousEvaluationType.DataType, null);

            var lambda = Expression.Lambda(
                Expression.Call(
                    target,
                    parameter),
                parameter);

            tree.AddPostExecuteTransformer(lambda);
        }
コード例 #2
0
		protected static void AddClientSideEval(MethodInfo target, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
		{
			var type = queryModelVisitor.Model.SelectClause.Selector.Type;
			target = target.MakeGenericMethod(type);

			var parameter = Expression.Parameter(typeof(IQueryable<>).MakeGenericType(type), null);

			var lambda = Expression.Lambda(
				Expression.Call(
					target,
					parameter),
				parameter);

			tree.AddPostExecuteTransformer(lambda);
		}
コード例 #3
0
ファイル: ProcessFetch.cs プロジェクト: pruiz/nhibernate-old
        public void Process(FetchRequestBase resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree, string sourceAlias)
        {
            var join = tree.TreeBuilder.Dot(
                tree.TreeBuilder.Ident(sourceAlias),
                tree.TreeBuilder.Ident(resultOperator.RelationMember.Name));

            string alias = queryModelVisitor.Model.GetNewName("_");

            tree.AddFromClause(tree.TreeBuilder.LeftFetchJoin(join, tree.TreeBuilder.Alias(alias)));
            tree.AddDistinctRootOperator();

            foreach (var innerFetch in resultOperator.InnerFetchRequests)
            {
                Process(innerFetch, queryModelVisitor, tree, alias);
            }
        }
コード例 #4
0
        public void Process(FetchRequestBase resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
        {
            var querySource = QuerySourceLocator.FindQuerySource(queryModelVisitor.Model, resultOperator.RelationMember.DeclaringType);

            Process(resultOperator, queryModelVisitor, tree, querySource.ItemName);
        }
コード例 #5
0
        private void Process(FetchRequestBase resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree, HqlDot memberPath, IType propType)
        {
            string alias = null;

            if (resultOperator is FetchOneRequest)
            {
                if (propType == null)
                {
                    var metadata = queryModelVisitor.VisitorParameters.SessionFactory
                                   .GetClassMetadata(resultOperator.RelationMember.ReflectedType);
                    propType = metadata?.GetPropertyType(resultOperator.RelationMember.Name);
                }

                if (propType != null && !propType.IsAssociationType)
                {
                    tree.AddFromLastChildClause(tree.TreeBuilder.Fetch());
                    tree.AddFromLastChildClause(memberPath);

                    ComponentType componentType = null;
                    foreach (var innerFetch in resultOperator.InnerFetchRequests)
                    {
                        if (componentType == null)
                        {
                            componentType = propType as ComponentType;
                            if (componentType == null)
                            {
                                throw new InvalidOperationException(
                                          $"Property {innerFetch.RelationMember.Name} cannot be fetched from a non component type property {resultOperator.RelationMember.Name}.");
                            }
                        }

                        var subTypeIndex = componentType.GetPropertyIndex(innerFetch.RelationMember.Name);
                        memberPath = tree.TreeBuilder.Dot(
                            memberPath,
                            tree.TreeBuilder.Ident(innerFetch.RelationMember.Name));

                        Process(innerFetch, queryModelVisitor, tree, memberPath, componentType.Subtypes[subTypeIndex]);
                    }

                    return;
                }

                var relatedJoin = queryModelVisitor.RelatedJoinFetchRequests.FirstOrDefault(o => o.Value == resultOperator).Key;
                if (relatedJoin != null)
                {
                    alias = queryModelVisitor.VisitorParameters.QuerySourceNamer.GetName(relatedJoin);
                }
            }

            if (alias == null)
            {
                alias = queryModelVisitor.Model.GetNewName("_");
                tree.AddFromClause(tree.TreeBuilder.LeftFetchJoin(memberPath, tree.TreeBuilder.Alias(alias)));
            }

            tree.AddDistinctRootOperator();

            foreach (var innerFetch in resultOperator.InnerFetchRequests)
            {
                Process(innerFetch, queryModelVisitor, tree, alias);
            }
        }
コード例 #6
0
 protected QueryDescription GetQueryDescription(Remotion.Linq.QueryModel queryModel)
 {
     return(LastGeneratedDescription = QueryModelVisitor.FromQueryModel(queryModel));
 }
コード例 #7
0
 public void Process(OptionResultOperator resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
 {
     tree.AddAdditionalCriteria((q, p) => q.SetOption((string)resultOperator.Option.Value));
 }
コード例 #8
0
 public void Process(AnyResultOperator anyOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
 {
     Process(tree);
 }
コード例 #9
0
 public void Process(FetchRequestBase resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree, string sourceAlias)
 {
     Process(resultOperator, queryModelVisitor, tree, null, sourceAlias);
 }
コード例 #10
0
ファイル: ProcessAny.cs プロジェクト: ImanRezaeipour/GTS
 public void Process(AnyResultOperator anyOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
 {
     tree.SetRoot(tree.TreeBuilder.Exists((HqlQuery)tree.Root));
 }
コード例 #11
0
 public abstract void Process(ResultOperatorBase resultOperator, QueryModelVisitor queryModel, IntermediateHqlTree tree);
コード例 #12
0
 public abstract void Process(ResultOperatorBase resultOperator, QueryModelVisitor queryModel, IntermediateHqlTree tree);
コード例 #13
0
        private void AssertResult(
            IQueryable query,
            bool rewriteQuery,
            bool supported,
            string expectedEntityName,
            string expectedMemberPath,
            Predicate <IType> expectedMemberType,
            Predicate <IAbstractComponentType> expectedComponentType = null,
            bool?nullability = true)
        {
            expectedComponentType = expectedComponentType ?? (o => o == null);

            var expression         = query.Expression;
            var preTransformResult = NhRelinqQueryParser.PreTransform(expression, new PreTransformationParameters(QueryMode.Select, Sfi));

            expression = preTransformResult.Expression;
            var constantToParameterMap = ExpressionParameterVisitor.Visit(preTransformResult);
            var queryModel             = NhRelinqQueryParser.Parse(expression);
            var requiredHqlParameters  = new List <NamedParameterDescriptor>();
            var visitorParameters      = new VisitorParameters(
                Sfi,
                constantToParameterMap,
                requiredHqlParameters,
                new QuerySourceNamer(),
                expression.Type,
                QueryMode.Select);

            if (rewriteQuery)
            {
                QueryModelVisitor.GenerateHqlQuery(
                    queryModel,
                    visitorParameters,
                    true,
                    NhLinqExpressionReturnType.Scalar);
            }

            var found = _tryGetMappedType(
                Sfi,
                queryModel.SelectClause.Selector,
                out var memberType,
                out var entityPersister,
                out var componentType,
                out var memberPath);

            Assert.That(found, Is.EqualTo(supported), $"Expression should be {(supported ? "supported" : "unsupported")}");
            Assert.That(entityPersister?.EntityName, Is.EqualTo(expectedEntityName), "Invalid entity name");
            Assert.That(memberPath, Is.EqualTo(expectedMemberPath), "Invalid member path");
            Assert.That(() => expectedMemberType(memberType), $"Invalid member type: {memberType?.Name ?? "null"}");
            Assert.That(() => expectedComponentType(componentType), $"Invalid component type: {componentType?.Name ?? "null"}");

            if (found)
            {
                Assert.That(
                    _tryGetMappedNullability(Sfi, queryModel.SelectClause.Selector, out var isNullable),
                    Is.EqualTo(nullability.HasValue),
                    $"Expression should be {(nullability.HasValue ? "supported" : "unsupported")}");
                if (nullability.HasValue)
                {
                    Assert.That(nullability, Is.EqualTo(isNullable), "Nullability is not correct");
                }
            }
        }
コード例 #14
0
 public override void Process(ResultOperatorBase resultOperator, QueryModelVisitor queryModel, IntermediateHqlTree tree)
 {
     _processor.Process((T)resultOperator, queryModel, tree);
 }
コード例 #15
0
        public void Process(LockResultOperator resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
        {
            var alias = queryModelVisitor.VisitorParameters.QuerySourceNamer.GetName(resultOperator.QuerySource);

            tree.AddAdditionalCriteria((q, p) => q.SetLockMode(alias, (LockMode)resultOperator.LockMode.Value));
        }
コード例 #16
0
ファイル: ProcessGroupBy.cs プロジェクト: renefc3/nhibernate
 public void Process(GroupResultOperator resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
 {
     tree.AddGroupByClause(tree.TreeBuilder.GroupBy(
                               HqlGeneratorExpressionTreeVisitor.Visit(resultOperator.KeySelector, queryModelVisitor.VisitorParameters)
                               .AsExpression()));
 }
コード例 #17
0
ファイル: ProcessSingle.cs プロジェクト: tker/nhibernate-core
        public void Process(SingleResultOperator resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
        {
            var firstMethod = resultOperator.ReturnDefaultWhenEmpty ? SingleOrDefault : Single;

            AddClientSideEval(firstMethod, queryModelVisitor, tree);
        }
コード例 #18
0
 public void Process(FetchManyRequest resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
 {
     base.Process(resultOperator, queryModelVisitor, tree);
 }
コード例 #19
0
 public void Process(AsQueryableResultOperator resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
 {
     // Ignore AsQueryable
     // It could be used to detect accidental usage of IEnumerable-based extension methods
     // on query roots, resulting in in-memory queries instead of database queries.
 }
コード例 #20
0
 public void Process(ClientSideSelect2 resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
 {
     tree.AddListTransformer(resultOperator.SelectClause);
 }
コード例 #21
0
 public void Process(FetchLazyPropertiesResultOperator resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
 {
     tree.AddFromLastChildClause(tree.TreeBuilder.Fetch());
 }
コード例 #22
0
ファイル: ProcessFetch.cs プロジェクト: pruiz/nhibernate-old
        public void Process(FetchRequestBase resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
        {
            var querySource = QuerySourceLocator.FindQuerySource(queryModelVisitor.Model, resultOperator.RelationMember.DeclaringType);

            Process(resultOperator, queryModelVisitor, tree, querySource.ItemName);
        }
コード例 #23
0
ファイル: ProcessTimeout.cs プロジェクト: Cary123/NHibernate
 public void Process(TimeoutResultOperator resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
 {
     tree.AddAdditionalCriteria((q, p) => q.SetTimeout((int)resultOperator.Timeout.Value));
 }