随着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(); }
时间: 2024-10-01 02:49:02