[EF]

  随着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();
            }

  

原文地址:https://www.cnblogs.com/fred-bao/p/4415510.html