尽管我讨厌这个答案,但实际的答案是你不能轻易做到。这将是一个真正的痛苦。我已经看到很多错误的答案和很多人说你应该首先让你的数据库字段是正确的类型的答案,这是没有帮助的。
您的问题类似于MSDN 上的这个问题。
根据您使用的 EF 类型,有多种可能性。
1. 您正在使用 EDMX 文件。
(不是代码优先或逆向工程代码优先)。
你可以使用这样的东西(来自这个答案):
[EdmFunction("PlusDomain", "ParseDouble")]
public static double ParseDouble(string stringvalue)
{
// This method exists for use in LINQ queries,
// as a stub that will be converted to a SQL CAST statement.
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 >= 4.1 中首先使用代码。
你完了。微软认为不适合将任何此类功能添加到SqlFunctions
. 您可以期望的最好的方法是将标量 SQL 函数添加到您的数据库中,并(也许)尝试将其映射到您的上下文中。微软认为首先在代码中做这样的事情没有任何意义。幸运的是,他们也没有完全阻止这些事情。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 制作的外部库(请参阅此处)。
相反,您可以尝试像在这个问题中那样手动执行相同的操作。
我为我的需要确定的更快的解决方案是只创建一个具有转换类型的视图。这避免了整个问题。