2015-12-03 12 views
8

मैं करने के लिए संस्थाओं को क्वेरीक्या मैं LINQ से Entities क्वेरी में CAST का उपयोग कर सकता हूं?

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

मैं एफई कि मैं इसे लगाने और उन्हें यह materializing से पहले सूची मूल्य के लिए एक cast लागू करना चाहते हैं निर्दिष्ट कर सकते हैं एक LINQ है? क्या EntityFunctions.Cast की तरह कुछ है? या मैं ESQL cast फ़ंक्शन का उपयोग कर सकता हूं?

मैं LINQ इन पंक्तियों

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

मेरा लक्ष्य परिशुद्धता/पैमाने के एक झुंड क्वेरी से छुटकारा पाने के लिए है के साथ एक SQL क्वेरी उत्पन्न करना चाहते हैं। क्योंकि दशमलव घटाव और विभाजन है, गणित का परिणाम एक दशमलव (38, 26) है! .NET से अधिक तरीका संभाल सकता है और मुझे आवश्यकता से अधिक है।

+0

क्या आप 'कन्वर्ट' सदस्यों का उपयोग नहीं कर सकते? –

+0

@AmitKumarGhosh 'Convert.ToDecimal' ईएफ –

+1

द्वारा पहचाना नहीं गया है जो मुझे पता है केवल [SqlFunctions] (https://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions % 28v = vs.110% 29.aspx)। इन कलाकारों में आपकी कास्ट मौजूद नहीं है। – tschmit007

उत्तर

2

ईएफ आपको DbFunction विशेषता का उपयोग कर डेटाबेस कार्यों में सीएलआर कार्यों को मानचित्र करने की अनुमति देता है। दुर्भाग्यवश, ऐसा लगता है कि निर्मित cast और convert फ़ंक्शंस नहीं हैं और ऐसा लगता है कि आप उन्हें मानचित्र बना सकते हैं।

इसके बजाय आप एक यूडीएफ बना सकते हैं जो इसे कास्ट करता है और इसे DbModel में मानचित्र करता है। मैपिंग एपीआई जटिल है इसलिए मैं आपके लिए यह करने के लिए Code First Functions लाइब्रेरी का उपयोग करूंगा। (यदि आप पहले डेटाबेस या पहले मॉडल का उपयोग कर रहे हैं, तो आप अपने एसएसडीएल और सीएसडीएल में मैन्युअल रूप से मैपिंग कर सकते हैं)। इसके अलावा, यूडीएफ के अंदर गतिशील कास्टिंग करने का कोई तरीका नहीं है, इसलिए आपको अपनी इच्छित प्रत्येक कलाकार के लिए अलग-अलग कार्यों को लिखना होगा। 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 अधिक जानकारी के लिए लेख देखें।

संबंधित मुद्दे