簡體   English   中英

我可以在LINQ to Entities查詢中使用CAST嗎?

[英]Can I use a CAST inside a LINQ to Entities query?

我有一個LINQ to Entities查詢

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

我可以指定EF,我希望它應用cast查詢和物化它1日前標價? 是否有類似EntityFunctions.Cast東西? 或者,我可以使用ESQL cast功能?

我希望LINQ能夠沿着這些方向生成SQL查詢

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

1我的目標是擺脫一堆精度/縮放查詢。 因為有十進制減法和除法,所以數學結果是小數(38,26)! 這比.NET可以處理的更多,而且超出了我的需要。

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

相反,您可以創建一個UDF來執行轉換並將其映射到DbModel 映射API很復雜,所以我會使用Code First Functions庫為您完成。 (如果您首先使用數據庫或首先使用模型,則可以在SSDL和CSDL 1中手動執行映射)。 此外,無法在UDF中進行動態轉換,因此您需要為每個所需的轉換選擇單獨的函數。 這是cast(field as decimal(10,4)的例子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))
};

1有關更多詳細信息,請參閱此博客文章或此MSDN文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM