2015-12-03 101 views
8

我有一個LINQ到實體查詢我可以在LINQ to Entities查詢中使用CAST嗎?

From item In ctx.Items 
Select new { 
    ListPrice = item.Cost/(1M - item.Markup) 
}; 

我可以指定我希望它查詢和物化它前對cast的標價EF?有沒有像EntityFunctions.Cast也許?或者我可以使用ESQL cast函數嗎?

我希望LINQ繼續沿着這條

SELECT cast((Cost/(1 - Markup)) as decimal(10, 2)) AS ListPrice 

我的目標是擺脫了一堆精度/規模的查詢生成的SQL查詢。因爲有十進制減法和除法,數學結果是小數(38,26)!這比.NET可以處理的要多,而且比我需要的要多。

+0

你不能使用'Convert'成員嗎? –

+0

@AmitKumarGhosh'Convert.ToDecimal'不被EF –

+1

識別,我知道的唯一函數來自[SqlFunctions](https://msdn.microsoft.com/zh-cn/library/system.data.objects.sqlclient.sqlfunctions %28V = vs.110%29.aspx)。您的演員不在這些功能中。 – tschmit007

回答

2

EF允許您使用DbFunction屬性將CLR函數映射到數據庫函數。不幸的是,它看起來像內置的castconvert不是功能,它看起來不像你可以映射到它們。

相反,您可以創建一個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文章的更多細節。

相關問題