How can I use SQL Server JSON_VALUE function in EF 6 Code First for classic .NET How can I use SQL Server JSON_VALUE function in EF 6 Code First for classic .NET json json

How can I use SQL Server JSON_VALUE function in EF 6 Code First for classic .NET


In classic .NET it's a little bit different, but still possible like this:

protected override void OnModelCreating(DbModelBuilder modelBuilder){    modelBuilder.Conventions.Add(new RegisterJsonValueFunctionConvention());}// Than define your function[DbFunction("CodeFirstDatabaseSchema", "JSON_VALUE")]public static string JsonValue(string expression, string path){    throw new NotSupportedException();}

Then, because JSON_VALUE is not defined in the Entity Framework SQL Server provider manifest, you have to create IStoreModelConvention like this:

public class RegisterJsonValueFunctionConvention : IStoreModelConvention<EdmModel>{    public void Apply(EdmModel item, DbModel model)    {        var expressionParameter = FunctionParameter.Create("expression", GetStorePrimitiveType(model, PrimitiveTypeKind.String), ParameterMode.In);        var pathParameter = FunctionParameter.Create("path", GetStorePrimitiveType(model, PrimitiveTypeKind.String), ParameterMode.In);        var returnValue = FunctionParameter.Create("result", GetStorePrimitiveType(model, PrimitiveTypeKind.String), ParameterMode.ReturnValue);        CreateAndAddFunction(item, "JSON_VALUE", new[] { expressionParameter, pathParameter }, new[] { returnValue });    }    protected EdmFunction CreateAndAddFunction(EdmModel item, string name, IList<FunctionParameter> parameters, IList<FunctionParameter> returnValues)    {        var payload = new EdmFunctionPayload { StoreFunctionName = name, Parameters = parameters, ReturnParameters = returnValues, Schema =  GetDefaultSchema(item), IsBuiltIn = true };        var function = EdmFunction.Create(name, GetDefaultNamespace(item), item.DataSpace, payload, null);        item.AddItem(function);        return function;    }    protected EdmType GetStorePrimitiveType(DbModel model, PrimitiveTypeKind typeKind)    {        return model.ProviderManifest.GetStoreType(TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(typeKind))).EdmType;    }    protected string GetDefaultNamespace(EdmModel layerModel)    {        return layerModel.GlobalItems.OfType<EdmType>().Select(t => t.NamespaceName).Distinct().Single();    }    protected string GetDefaultSchema(EdmModel layerModel)    {        return layerModel.Container.EntitySets.Select(s => s.Schema).Distinct().SingleOrDefault();    }}


I'm not sure it works with Entity-Framework 6, but probably worth mentioning Impatient.

It Allows you to perform LINQ queries on json_value columns and more.