2016-02-15 14 views
5

मैं एक WebAPI आवेदन जहां मैं एक विधि लिखा है निम्नलिखित कोड का उपयोग कर छात्र प्राप्त करने के लिए साथ काम कर रहा हूँ:Guid.Parse() विधि का उपयोग करते समय अपवाद क्यों फेंकता है?

public Student GetStudent(string studentId) 
    { 
     var student = this.context.Students.FirstOrDefault(x => x.Id == Guid.Parse(studentId)); 
     return student; 
    } 

यहाँ studentId एक WebAPI कॉल से हो रही है। लेकिन जब मैं इस आवेदन ऐसा एक अपवाद फेंकता है भागने की कोशिश की:

अतिरिक्त जानकारी: LINQ संस्थाओं विधि 'System.Guid पार्स (System.String)' विधि, और इस विधि को नहीं पहचानता है करने के लिए नहीं किया जा सकता एक स्टोर अभिव्यक्ति में।

क्या कोई मुझे बताता है कि यह क्यों हुआ और मैं इस मुद्दे को कैसे हल कर सकता हूं?

उत्तर

7

सबसे पहले जब आप EntityFramework का उपयोग करते हैं, तो यह Guid.Parse() विधि को SQL में कनवर्ट करने का प्रयास करेगा और ऐसा करने में विफल रहता है क्योंकि यह SQL कथन/'स्टोर अभिव्यक्ति' में परिवर्तित नहीं हो सकता है।

आपको केवल स्ट्रिंग पार्सिंग को स्टोर अभिव्यक्ति से बाहर ले जाना चाहिए और क्वेरी में इसका उपयोग करने से पहले स्ट्रिंग को Guid मान पर पार्स करना चाहिए।

public Student GetStudent(string studentId) 
    { 
     var stdId = Guid.Parse(studentId); 
     var student = this.context.Students.FirstOrDefault(x => x.Id == stdId); 
     return student; 
    } 
+0

तो, मैं LINQ क्वेरी में किसी भी प्रकार की विधि कॉलिंग का उपयोग नहीं कर सकता? – coderhunk

+0

आप विधियों का उपयोग कर सकते हैं ईएफ एसक्यूएल में अनुवाद कर सकते हैं। यह ठीक है कि ईएफ/एल 2 एसक्यूएल कैसे काम करता है, LINQ से SQL का अनुवाद करता है। – DevilSuichiro

+0

@coderhunk विधियों EF – Mainul

2

आप इस तरीके का प्रयास हो सकता है:

public Student GetStudent(string studentId) 
{ 
    var student = (from c in this.context.Students 
        let guidId = Guid.Parse(studentId) 
        where c.Id == guidId 
        select c).FirstOrDefault(); 

    return student; 
} 

इस दृष्टिकोण let में आप नए अस्थायी चर, जो बाद में LinqToEntities क्वेरी में उपयोग किया जा सकता है बनाने के लिए अनुमति देता है।

मैं अपवाद के कारण के बारे में @Mainul जवाब के साथ सहमत हैं:

सभी की Firt जब आप EntityFramework उपयोग करते हैं, किसी SQL को Guid.Parse() विधि में परिवर्तित करने की कोशिश की इस इच्छा और यह करने के लिए विफल रहता है क्योंकि यह SQL कथन/'स्टोर अभिव्यक्ति' में परिवर्तित नहीं हो सकता है।

0

के रूप में कहा गया है here

इकाई की रूपरेखा, एसक्यूएल ओर अपने प्रक्षेपण पर अमल करने जहां String.Format करने के लिए कोई बराबर है कोशिश कर रहा है। वस्तुओं के लिए LINQ के साथ उस भाग की बल मूल्यांकन करने के लिए AsEnumerable() का उपयोग

आपका मामला Guid.Parse SQL क्वेरी जो एसक्यूएल में नहीं पाया जाता तब्दील मूल्यांकन करने के लिए कोशिश करता है। जब मैं जैसे-

var query = db.Table.Where(f=> f.Date == paramDate.Date.AddDays(-1)).ToList(); 
0

अभी तक बेहतर तारीख हिस्सा संचालित करने के लिए कोशिश कर रहा था

यह भी मेरे साथ हुआ, मैं हस्ताक्षर के लिए string studentId के बजाय, जोड़ सकते हैं, Guid studentId का उपयोग के बाद से है कि क्या तुम वैसे भी जरूरत है। और इससे यह स्पष्ट हो जाता है कि छात्र आईडी guid है, कॉलर को string नहीं। यदि कॉलर वापसी Student ऑब्जेक्ट का उपयोग करना चाहता है, तो आप नहीं चाहते कि वह यह string studentid = student.Id करें। आप उसे Guid myStudentId = student.Id करना चाहते हैं।

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

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