コード例 #1
0
        /// <summary>
        /// 获取表达式的执行计划。
        /// </summary>
        /// <param name="expression"></param>
        /// <returns></returns>
        public Expression GetExecutionPlan(Expression expression)
        {
            try
            {
                if (expression is LambdaExpression lambda)
                {
                    expression = lambda.Body;
                }

                var section = ConfigurationUnity.GetSection <TranslatorConfigurationSection>();
                var trans   = service.InitializeContext.Provider.GetTranslateProvider();
                var options = GetTranslateOptions();

                using (var scope = new TranslateScope(service, trans, options))
                {
                    var translation = trans.Translate(expression);
                    var translator  = trans.CreateTranslator();

                    return(ExecutionBuilder.Build(translation, e => translator.Translate(e)));
                }
            }
            catch (Exception ex)
            {
                throw new TranslateException(expression, ex);
            }
        }
コード例 #2
0
        /// <summary>
        /// 获取表达式的执行计划。
        /// </summary>
        /// <param name="expression"></param>
        /// <param name="option"></param>
        /// <returns></returns>
        public Expression GetExecutionPlan(Expression expression, TranslateOptions option = null)
        {
            try
            {
                LambdaExpression lambda = expression as LambdaExpression;
                if (lambda != null)
                {
                    expression = lambda.Body;
                }

                var section = ConfigurationUnity.GetSection <TranslatorConfigurationSection>();
                var package = GetTranslateProvider();
                var options = option ?? (section != null ? section.Options : TranslateOptions.Default);

                using (var scope = new TranslateScope(context, package))
                {
                    var translation = package.Translate(expression, options);
                    return(package.BuildExecutionPlan(translation, options));
                }
            }
            catch (Exception ex)
            {
                throw new TranslateException(expression, ex);
            }
        }
コード例 #3
0
        public Expression GetExecutionPlan(Expression expression, TranslateOptions option = null)
        {
            try
            {
                LambdaExpression lambda = expression as LambdaExpression;
                if (lambda != null)
                {
                    expression = lambda.Body;
                }

                var section = ConfigurationUnity.GetSection <TranslatorConfigurationSection>();
                var package = GetTranslateProvider();
                var options = option ?? (section == null ? package.CreateOptions() : section.Options);

                using (var scope = new TranslateScope(context, package))
                {
                    var translation = package.Translate(expression, options);

                    var parameters = lambda != null ? lambda.Parameters : null;
                    var provider   = Find(expression, parameters, typeof(QueryProvider));
                    if (provider == null)
                    {
                        var rootQueryable = Find(expression, parameters, typeof(IQueryable));
                        provider = Expression.Property(rootQueryable, typeof(IQueryable).GetProperty("Provider"));
                    }

                    return(package.BuildExecutionPlan(translation, provider, options));
                }
            }
            catch (Exception ex)
            {
                throw new TranslateException(expression, ex);
            }
        }
コード例 #4
0
        /// <summary>
        /// 执行表达式的翻译。
        /// </summary>
        /// <param name="expression">表示 LINQ 查询的表达式树。</param>
        /// <returns>一个 <see cref="TranslateResult"/>。</returns>
        /// <param name="option">指定解析的选项。</param>
        /// <exception cref="TranslateException">对 LINQ 表达式解析失败时抛出此异常。</exception>
        public TranslateResult Translate(Expression expression, TranslateOptions option = null)
        {
            try
            {
                LambdaExpression lambda = expression as LambdaExpression;
                if (lambda != null)
                {
                    expression = lambda.Body;
                }

                var section = ConfigurationUnity.GetSection <TranslatorConfigurationSection>();
                var package = GetTranslateProvider();
                var options = option ?? (section == null ? package.CreateOptions() : section.Options);

                using (var scope = new TranslateScope(context, package))
                {
                    var translation = package.Translate(expression, options);
                    var translator  = package.CreateTranslator();
                    translator.InternalContext = context;
                    translator.Environment     = environment;
                    translator.Options         = options;

                    TranslateResult result;
                    var             selects = SelectGatherer.Gather(translation).ToList();
                    if (selects.Count > 0)
                    {
                        result = translator.Translate(selects[0]);
                        if (selects.Count > 1)
                        {
                            var list = new List <TranslateResult>();
                            for (var i = 1; i < selects.Count; i++)
                            {
                                list.Add(translator.Translate((selects[i])));
                            }

                            result.NestedResults = list.AsReadOnly();
                        }
                    }
                    else
                    {
                        translator.Options.HideTableAliases = translator.Options.HideColumnAliases = true;
                        result = translator.Translate(expression);
                    }

                    return(result);
                }
            }
            catch (Exception ex)
            {
                throw new TranslateException(expression, ex);
            }
        }
コード例 #5
0
        /// <summary>
        /// 执行表达式的翻译。
        /// </summary>
        /// <param name="expression">表示 LINQ 查询的表达式树。</param>
        /// <returns>一个 <see cref="TranslateResult"/>。</returns>
        /// <param name="options">指定解析的选项。</param>
        /// <exception cref="TranslateException">对 LINQ 表达式解析失败时抛出此异常。</exception>
        public TranslateResult Translate(Expression expression, TranslateOptions options = null)
        {
            try
            {
                if (expression is LambdaExpression lambda)
                {
                    expression = lambda.Body;
                }

                var trans = service.InitializeContext.Provider.GetTranslateProvider();
                options = options ?? GetTranslateOptions();

                using (var scope = new TranslateScope(service, trans, options))
                {
                    var translation = trans.Translate(expression);
                    var translator  = trans.CreateTranslator();

                    TranslateResult result;
                    var             selects = SelectGatherer.Gather(translation).ToList();
                    if (selects.Count > 0)
                    {
                        result = translator.Translate(selects[0]);
                        if (selects.Count > 1)
                        {
                            var list = new List <TranslateResult>();
                            for (var i = 1; i < selects.Count; i++)
                            {
                                list.Add(translator.Translate((selects[i])));
                            }

                            result.NestedResults = list.AsReadOnly();
                        }
                    }
                    else
                    {
                        result = translator.Translate(expression);
                    }

                    return(result);
                }
            }
            catch (Exception ex)
            {
                throw new TranslateException(expression, ex);
            }
        }