2011-06-16 10 views
6

में संग्रहित प्रक्रियाएं मेरे पास एक SQL सर्वर डेटाबेस में संग्रहित प्रक्रिया है जो परिणामों की एक सूची देता है। यह संग्रहीत प्रक्रिया LINQ-to-SQL dbml फ़ाइल में उजागर की गई है। मैं कैसे एक List<MyObject> को संग्रहीत प्रक्रिया के परिणाम कन्वर्ट करने के लिए पता नहीं हैLINQ-to-SQL

public List<MyObject> GetObjects() 
{ 
    List<MyObject> objects = new List<MyObject>(); 
    using (DatabaseDataContext context = new DatabaseDataContext()) 
    { 
    objects = context.GetObjectsFromDB(); // This is my problem line 
    } 
    return objects; 
} 

मेरे समस्या है,: मैं तो इस तरह के रूप में इस संग्रहीत प्रक्रिया कॉल करने के लिए प्रयास करें। context.GetObjectsFromDBSystem.Data.Linq.ISingleResult<sprocName> देता है। मैं संग्रहित प्रक्रिया के परिणाम को मजबूत पूर्व परिभाषित प्रकार की सूची में कैसे परिवर्तित करूं?

धन्यवाद!

+1

कृपया दिखाने कोड sproc फोन करने के लिए इस्तेमाल किया जा रहा। –

+2

एक साइड नोट के रूप में: शुरुआत में सूची को नया करना अनावश्यक (और अपर्याप्त) है, प्रारंभिक सूची ऑब्जेक्ट केवल जीसीड होगा। – BrokenGlass

उत्तर

4

इस प्रयास करें,

public List<MyObject> GetObjects() 
{ 

using (DatabaseDataContext context = new DatabaseDataContext()) 
{ 
var objects = context.GetObjectsFromDB(); 
return new List<MyObject>(objects); 
} 
} 

अपडेट किया गया: स्पष्ट कास्टिंग का उपयोग करके यह इस

public List<MyObject> GetObjects() 
{ 
using (DatabaseDataContext context = new DatabaseDataContext()) 
{ 
    List<MyObject> objects = (List<MyObject>)context.GetObjectsFromDB(); 
    return objects; 
} 
} 
+1

यह क्यों काम करता है? –

+0

@ जस्टिन: यहां VAR ने आपकी ऑब्जेक्ट को इच्छा प्रकार में डाला है और कंपाइलर इसे रन टाइम पर प्राप्त करेगा..तुम इसे स्पष्ट कास्टिंग करके भी कर सकते हैं और अपने कोड में आपने किसी भी कास्टिंग को परिभाषित नहीं किया है ... – Syeda

+0

आह, मैं देख रहा हूँ कि तुम क्या कर रहे हो। मैं 'सूची ऑब्जेक्ट्स = नई सूची (); द्वारा आपके भ्रमित था, जो आपके मूल संस्करण में है, जो मुझे लगता है कि अनावश्यक है। आप 'रिटर्न (सूची ) संदर्भ के साथ' उपयोग 'ब्लॉक में सब कुछ बदल सकते हैं। GetObjectsFromDB();' और यह ठीक काम करेगा। –

0

ISingleResult<T>IEnumerable<T> से विरासत प्राप्त करता है। जब तक 'टी' MyObject का प्रतिनिधित्व करता है, तब तक आप अनुक्रम के माध्यम से पुन: प्रयास करने में सक्षम होना चाहिए। यदि 'टी' एक अलग प्रकार है, तो मैं MyObject पर एक कन्स्ट्रक्टर रखूंगा जो डीबी प्रकार लेता है और इससे MyObject बनाता है।

क्या आपने एसपीआरओसी कॉल के बाद ब्रेकपॉइंट छोड़ने की कोशिश की है, यह देखने के लिए कि आप जिस वस्तु को वापस प्राप्त करते हैं उसके बारे में डीबगर क्या कहता है?

0

Enumerable वर्ग भी एक ToList सदस्य समारोह है कि मैं आम तौर पर इस के लिए उपयोग किया है की तरह किया जा सकता है। http://msdn.microsoft.com/en-us/library/bb342261.aspx

साथ ही, लिंक से एसक्यूएल का उपयोग करते समय, मैं हमेशा नल के परिणाम का परीक्षण करता हूं। यदि मैं एक सूची की अपेक्षा करता हूं, तो जांच करें कि सूची में कनवर्ट करने से पहले गिनती शून्य से अधिक है।

public List<MyObject> GetObjects() 
{ 
    List<MyObject> objects = null; // no need to "new" here 
    using (DatabaseDataContext context = new DatabaseDataContext()) 
    { 
    var tmp = context.GetObjectsFromDB(); 
    if (tmp != null) 
    { 
     if (tmp.Count() > 0) 
     { 
     objects = (List<MyObject>)tmp.ToList(); 
     } 
    } 
    } 
    return objects; 
} 

इसी प्रकार, यदि आप केवल एक ही परिणाम की उम्मीद,

myObject = (MyObject)tmp.ToSingle(); 

अन्त में उपयोग करते हैं, आप एक कोशिश पकड़ ब्लॉक में इस समारोह लपेटकर पर विचार करने और SqlException पकड़ने और उचित रूप से त्रुटियों को संभाल कर सकते हैं।

मैं केवल विकासशील अनुप्रयोगों के अनुभव के कारण अतिरिक्त त्रुटि प्रबंधन का उल्लेख कर रहा हूं जो आपके पास अतिरिक्त त्रुटि हैंडलिंग कोड नहीं है तो क्रैश हो सकता है!

0

मैं जानता हूँ कि यह toooo देर हो चुकी है लेकिन ....

LINQ perpective, एस.पी. (एकल परिणाम के लिए उत्पादन का उपयोग नहीं) डेटासेट वापस आ जाएगी, इसलिए एक सूची आप से सपा लौटने क्षेत्र में बताने की बनाने के लिए से :

objects = context.GetObjectsFromDB().Select(x => x.MyObject); 

क्षेत्र से सपा लौटे के नाम यानी,

तरह
objects = context.GetObjectsFromDB().Select(x => x.Names); 
0

मैं एक ही समस्या थी!

मेरे समाधान रीमेक दुकान प्रक्रिया के लिए तालिका चर द्वारा अस्थायी तालिका की जगह था

नहीं करता ऑटो एमएपी spAA_Result:

CREATE PROCEDURE spAA 
AS 
CREATE TABLE #TABLETMP (ID INT, NAME varchar(50)) 
    ... 
SELECT * FROM #TABLETMP 

ऑटो एमएपी सही कक्षा spBB_Result:

CREATE PROCEDURE spBB 
AS 
DECLARE @TABLETMP AS TABLE (ID INT, NAME varchar(50)) 
    ... 
SELECT * FROM @TABLETMP 
0

हाँ क्या काम निम्नानुसार होगा:

List<string> listOfStrings = dbContext.spMyStoredProc().Select(x => x.Value).ToList<string>(); 

या

List<int> listOfInts = dbContext.spMyStoredProc().Select(x => x.Value).ToList<int>(); 
संबंधित मुद्दे