2015-12-03 22 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は、私の目標は、高精度/スケールクエリの束を取り除くことで、これらの線に沿ってSQLクエリ

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

を生成したいです。小数点以下の減算と除算があるので、数学の結果は小数です(38,26)!それは.NETが処理できる以上のもので、必要以上のものです。

+0

'Convert'メンバーを使用できませんか? –

+0

@AmitKumarGhosh 'Convert.ToDecimal'はEFによって認識されません –

+1

私が知っている唯一の機能は[SqlFunctions](https://msdn.microsoft.com/en-us/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の記事を参照してください。

関連する問題