Пример #1
0
 public async Task <SqlDefinition> ExecuteAsync(string sqlTemplate, TemplateOptions options) =>
 await ExecuteAsync(sqlTemplate, new EmptyTemplateParameterModel(), options);
Пример #2
0
        public async Task <SqlDefinition> ExecuteAsync(string sqlTemplate, object model, TemplateOptions options)
        {
            Throws.NotEmpty(sqlTemplate, nameof(sqlTemplate));
            Throws.NotNull(model, nameof(model));

            if (options == null)
            {
                options = TemplateOptions.Default;
            }

            var modelType = model.GetType();

            ValidateModel(modelType, model);

            var globalsType = typeof(Globals <>).MakeGenericType(modelType);

            var runner = pool.GetOrAdd(Tuple.Create(sqlTemplate, modelType), v =>
            {
                var parser        = new CSharpScriptCodeParser(sqlTemplate);
                var parseResult   = parser.Parse();
                var scriptOptions = ScriptOptions.Default.AddReferences(
                    typeof(SqlTemplateEngine).GetTypeInfo().Assembly,
                    modelType.GetTypeInfo().Assembly
                    ).AddImports("Km.Toi.Template", "System", "System.Linq")
                                    .AddImports(parseResult.Imports);

                return(CSharpScript.Create(parseResult.Code, scriptOptions, globalsType).CreateDelegate());
            });

            var builder = new SqlDefinitionBuilder(options);
            var global  = Activator.CreateInstance(globalsType, model, builder) as IGlobals;

            await runner(global);

            return(builder.Build());
        }