public async Task <SqlDefinition> ExecuteAsync(string sqlTemplate, TemplateOptions options) => await ExecuteAsync(sqlTemplate, new EmptyTemplateParameterModel(), options);
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()); }