Entity Framework 6处理User Defined Function(UDF SQL Server)

  随着EF5的发布,新增了对数据库(SQL Server) UDF的支持,具体可以看以下的连接:https://msdn.microsoft.com/en-us/data/hh859577.aspx,新发布的EF6也继承了这个特性。问题是这个UDF貌似只是针对TVF-Table Value Function,在尝试导入一个SCALAR Function的时候,很可惜,该function不能被导入。

  原因就是在EF6的版本里还没有对Scalar Function做支持。。。。。。

  但是也有相应的workaround,因为EF提供了DbFunction类,可以让我们直接在DbContext里写一个cutsom method,然后映射到SSDL里的一段自动生成的XML代码,这段代码是有EF model自动生成的,一个完整的例子:

Scalar Function:

  

CREATE FUNCTION [dbo].[Function20150410]

(

	@param1 int,

	@param2 int

)

RETURNS INT

AS

BEGIN

	RETURN @param1 + @param2

END

 

XML 代码:

<Function Name="Function20150410" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo" ReturnType="int">

          <Parameter Name="param1" Type="int" Mode="In" />

          <Parameter Name="param2" Type="int" Mode="In" />

        </Function>

 

Custom Method in DbContext Class:

[DbFunction("DFDBModel.Store", "Function20150410")]

        public ObjectResult<int> GetContentByIdAndCul(int id, int culture)

        {

            var objectContext = ((IObjectContextAdapter)this).ObjectContext;



            var parameters = new List<ObjectParameter>();

            parameters.Add(new ObjectParameter("Id", id));

            parameters.Add(new ObjectParameter("Culture", culture));



            return objectContext.CreateQuery<int>("DFDBModel.Store.Function20150410(@Id, @Culture)", parameters.ToArray()).Execute(MergeOption.NoTracking);

        }

 

 Call this method:

 

using (DFDBEntities db=new DFDBEntities())

            {

                var result = db.GetContentByIdAndCul(1, 1).FirstOrDefault();

            }

 

  

你可能感兴趣的:(SQL Server)