/// <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); } }
/// <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); } }
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); } }
/// <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); } }
/// <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); } }