public class FunctionConvention : IStoreModelConvention{ public void Apply(EdmModel item, DbModel model) { AddToCharFunc(model); AddToNumberFunc(model); } public void AddToCharFunc(DbModel dbModel) { var edmType = PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String); var payload = new EdmFunctionPayload { Schema = "SYS.STANDARD", ParameterTypeSemantics = ParameterTypeSemantics.AllowImplicitConversion, IsComposable = true, IsNiladic = false, IsBuiltIn = true, IsAggregate = false, IsFromProviderManifest = true, StoreFunctionName = "TO_CHAR", ReturnParameters = new[] { FunctionParameter.Create("ReturnType", edmType, ParameterMode.ReturnValue) }, Parameters = new[] { FunctionParameter.Create("Val", PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32), ParameterMode.In) } }; var function = EdmFunction.Create("TO_CHAR", "EntityLayer.Utility", DataSpace.SSpace, payload, null); dbModel.StoreModel.AddItem(function); } public void AddToNumberFunc(DbModel dbModel) { var edmType = PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Decimal); var payload = new EdmFunctionPayload { Schema = "SYS.STANDARD", ParameterTypeSemantics = ParameterTypeSemantics.AllowImplicitConversion, IsComposable = true, IsNiladic = false, IsBuiltIn = true, IsAggregate = false, IsFromProviderManifest = true, StoreFunctionName = "TO_NUMBER", ReturnParameters = new[] { FunctionParameter.Create("ReturnType", edmType, ParameterMode.ReturnValue) }, Parameters = new[] { FunctionParameter.Create("Val", PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String), ParameterMode.In) } }; var function = EdmFunction.Create("TO_NUMBER", "EntityLayer.Utility", DataSpace.SSpace, payload, null); dbModel.StoreModel.AddItem(function); } }
FunctionConvention sınıfı ilgili fonksiyonların haritalanması için gerekli meta bilgilerin oluşturulmasını sağlayan bir Convention sınıf oluşturulduktan sonra Context sınıfı içinde yer alan "OnModelCreating" fonksiyonu içinde tanımlanmaktadır.
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Add(new FunctionConvention()); }
Yukarıdaki işlemler yapıldıktan sonra LINQ sorgularında kullanılabilmesi için aşağıdaki gibi bir sınıf içinde ilgili fonksiyonların karşılıkları tanımlanmalıdır:
public class CommonFunctions { [DbFunction("EntityLayer.Utility", "TO_CHAR")] public static string TO_CHAR(int Val) { throw new NotSupportedException(); } [DbFunction("EntityLayer.Utility", "TO_NUMBER")] public static decimal TO_NUMBER(string Val) { throw new NotSupportedException(); } }
No comments:
Post a Comment