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