using System; using System.Collections.Generic; using System.Linq.Expressions; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Query.SqlExpressions; namespace ASC.Core.Common.EF.Model { public class ModelBuilderWrapper { private ModelBuilder ModelBuilder { get; set; } private Provider Provider { get; set; } private ModelBuilderWrapper(ModelBuilder modelBuilder, Provider provider) { ModelBuilder = modelBuilder; Provider = provider; } public static ModelBuilderWrapper From(ModelBuilder modelBuilder, Provider provider) { return new ModelBuilderWrapper(modelBuilder, provider); } public ModelBuilderWrapper Add(Action action, Provider provider) { if (provider == Provider) { action(ModelBuilder); } return this; } public ModelBuilderWrapper HasData(params T[] data) where T : class { ModelBuilder.Entity().HasData(data); return this; } public void AddDbFunction() { ModelBuilder .HasDbFunction(typeof(JsonExtensions).GetMethod(nameof(JsonExtensions.JsonValue))) .HasTranslation(e => { var res = new List(); if (e is List list) { if (list[0] is SqlConstantExpression key) { res.Add(new SqlFragmentExpression($"`{key.Value}`")); } if (list[1] is SqlConstantExpression val) { res.Add(new SqlConstantExpression(Expression.Constant($"$.{val.Value}"), val.TypeMapping)); } } return SqlFunctionExpression.Create("JSON_EXTRACT", res, typeof(string), null); }); } } }