EF允許您使用DbFunction
屬性將CLR函數映射到數據庫函數。不幸的是,它看起來像內置的cast
和convert
不是功能,它看起來不像你可以映射到它們。
相反,您可以創建一個UDF來執行演員表並將其映射到DbModel
中。映射API很複雜,因此我會使用Code First Functions庫爲您完成。 (如果首先使用數據庫,或者先使用數據庫,則可以在SSDL和CSDL中手動執行映射)。另外,在UDF內部沒有辦法進行動態轉換,因此您需要爲每個需要的轉換選擇單獨的函數。以下是cast(field as decimal(10,4)
的示例。
-- In SQL Server
CREATE FUNCTION ClrRound_10_4
(
@value decimal(28, 10)
)
RETURNS decimal(10,4)
AS
BEGIN
DECLARE @converted decimal(10,4)
SELECT @converted = cast(round(@value, 4) as decimal(10,4))
RETURN @converted
END
GO
//In your DbContext class
using CodeFirstStoreFunctions;
public class MyContext : DbContext {
protected override void OnModelCreating(DbModelBuilder builder) {
builder.Conventions.Add(new FunctionsConvention("dbo", typeof(Udf));
}
//etc
}
//In a static class named Udf (in the same namespace as your context)
using System.Data.Entity;
public static class Udf {
[DbFunction("CodeFirstDatabaseSchema", "ClrRound_10_4")]
public static decimal ClrRound_10_4(decimal value) {
throw new InvalidOperationException("Cannot call UDF directly!");
}
}
//In your LINQ query
from item in ctx.Items
select new {
ListPrice = Udf.ClrRound_10_4(item.Cost/(1M - item.Markup))
};
看到這個blog post或本MSDN文章的更多細節。
你不能使用'Convert'成員嗎? –
@AmitKumarGhosh'Convert.ToDecimal'不被EF –
識別,我知道的唯一函數來自[SqlFunctions](https://msdn.microsoft.com/zh-cn/library/system.data.objects.sqlclient.sqlfunctions %28V = vs.110%29.aspx)。您的演員不在這些功能中。 – tschmit007