尽管我很讨厌这个答案,但实际上你不能轻易地做到这一点。它将是一个真正的痛苦。
我看到了很多错误的答案和很多人说你应该在第一次就把数据库字段设置为正确的类型,这是没有帮助的。
你的问题类似于MSDN上的这个问题。
根据你使用的EF类型,有几种可能性。
1. 你正在使用EDMX文件(而不是代码优先或反向工程代码优先)。
你可以使用像这样的东西(从这个答案中):
[EdmFunction("PlusDomain", "ParseDouble")]
public static double ParseDouble(string stringvalue)
{
return System.Double.Parse(stringvalue);
}
将其映射到EDMX中,如下所示:
<Function Name="ParseDouble" ReturnType="Edm.Double">
<Parameter Name="stringvalue" Type="Edm.String" />
<DefiningExpression>
cast(stringvalue as Edm.Double)
</DefiningExpression>
</Function>
2. 如果你在EF中使用了Code First >= 4.1。
那么你可能会遇到麻烦。微软没有在SqlFunctions
中添加任何此类函数。你最好的希望是将一个标量SQL函数添加到你的数据库中,然后(也许)尝试将其映射到你的上下文中。微软认为在Code First中不需要做任何这样的事情,但幸运的是他们也没有完全阻止这样的事情发生。Fluent API功能强大,你可以像这样调用函数或存储过程(参考):
var outParam = new SqlParameter("overHours", SqlDbType.Int)
outParam.Direction = ParameterDirection.Output
或者像这样(参考):
var data = context.Database.ExecuteSqlCommand("dbo.sp_getNumberJobs @overHours OUT", outParam);
int numJobs = (int)outParam.Value;
但要使它们真正集成到LINQ to Entities中,您需要使用类似 CodeFirstFunctions 的东西,通过使用 EntityFramework.CodeFirstStoreFunctions NuGet软件包来实现。它将SQL功能映射到上下文中,但它仅适用于 .NET 4.5的外部库(请参见这里)。
相反,您可以尝试手动完成与 此问题 中所述的方式相同的操作。
我为自己的需求选择的更快速的解决方案是创建一个具有转换类型的视图。这避免了整个问题。
Convert.ToInt32(p.Value)
能够正常工作吗? - Marc GravellConvert.ToInt32
。EF可以理解这个方法。 - vcsjones