我使用的是数据库优先的EF6模型,其中包含一些标量值函数,而我遇到的问题与我预期的方式不一致。 SQL函数定义为:
dbo.GetCurrentPayOffAmountFunction(@ApplicationID int, @PayOffDate DateTime)
Returns decimal(18,2)
在.edmx中,我使用:
<Function Name="GetCurrentPayOffAmountFunction" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo" ReturnType="decimal">
<Parameter Name="ApplicationID" Type="int" Mode="In" />
<Parameter Name="PayOffDate" Type="datetime" Mode="In" />
</Function>
在EF项目的.cs中:
[DbFunction("PHXModel.Store", "GetCurrentPayOffAmountFunction")]
public decimal GetCurrentPayOffAmountFunction(int ApplicationID, DateTime PayOffDate)
{
var objectContext = ((IObjectContextAdapter)this).ObjectContext;
var parameters = new List<ObjectParameter>();
parameters.Add(new ObjectParameter("ApplicationID", ApplicationID));
parameters.Add(new ObjectParameter("PayOffDate", PayOffDate));
return Convert.ToDecimal(objectContext.CreateQuery<string>("PHXModel.Store.GetCurrentPayOffAmountFunction(@ApplicationID, @PayOffDate)", parameters.ToArray())
.Execute(MergeOption.NoTracking)
.FirstOrDefault());
}
现在,当我将其称为select的一部分时,这一切都正常,如下:
decimal app = db.Applications.Take(1).Select (a => db.GetCurrentPayOffAmountFunction(1000, DateTime.Now)).FirstOrDefault();
(&#34;上面的应用程序&#34;可以是我数据库中的任何表格,无论我在选择的左边实际使用了什么,该函数都会返回正确的值。)
但是,当我尝试在没有查询之前运行该函数时,例如:
decimal payoffAmount = db.GetCurrentPayOffAmountFunction(1000, DateTime.Now);
我总是收到错误:
InvalidOperationException:来自实体化的指定强制转换 &#39; System.Decimal&#39;输入&#39; System.String&#39;类型无效。
现在,我可以使用第一种方法来获取我的值并且它工作正常,但是我觉得错误的是获得一个随机项目,所以我可以调用我的函数。有没有人见过这个?我在这里做错了什么?