2010-10-15 16 views
6

से संग्रह के लिए प्रकार मैं एक विधि, कि खातोंवापसी LINQ क्वेरी

Public Shared Function GetAllNotesByUser(ByVal UserID As Guid) As Account (??) 
    Using db As New MyEntity 
     Dim query= (From A In db.Account _ 
        Where A.aspnet_Users.UserId = UserID _ 
        Select A) 
     Return query 
    End Using 
End Function 

मैं तो संग्रह में सभी खातों का कुल गणना करने के लिए एक और समारोह को यह पारित करने के लिए चाहते हैं के एक समूह रिटर्न दिया है। क्या यह एक सामान्य सूची, Ienumerable लौटने का सबसे अच्छा अभ्यास है, मुझे यकीन नहीं है कि LINQ और इकाई ढांचे के साथ सबसे अच्छा क्या काम करता है।

उत्तर

7

इस तरह से तरीकों से LINQ क्वेरी परिणामों का प्रचार करते समय, रिटर्न प्रकार के लिए सबसे अच्छा विकल्प LINQ से ऑब्जेक्ट्स के लिए IEnumerable(Of T) या अन्य LINQ प्रदाताओं के लिए IQueryable(Of T) है। इस मामले में ऐसा लगता है कि Account प्रश्न प्रकार के प्रश्न के आधार पर IEnumerable(Of Account) या IQueryable(Of T) प्रकार है।

+1

सबसे अच्छा विकल्प 'Inumerable' है, सिवाय इसके कि जब सबसे अच्छा विकल्प' IQueryable' है। ;) –

+0

@ किर्क, सच। प्रश्नों के बारे में भूल गए गैर-LINQ प्रश्नों को ऑब्जेक्ट करने के लिए – JaredPar

2

सबसे अच्छा प्रकार होगा

IEnumerable<Account> 

या VB में correspounding वाक्य रचना: पी

असल

, सभी LINQ कार्य (.Where(), .Distinct() आदि) मैं यह सोचने के लिए, IEnumerable<T> को विस्तार तरीके हैं उसी तरह श्रृंखला को जारी रखने के लिए अच्छा अभ्यास है।

+0

मैंने एमएसडीएन की खोज की है, लेकिन गलत जगह पर देखना चाहिए। आप कैसे जानते हैं कि WHERE() और Distinct() IENumerable के विस्तार विधियां हैं। मैं आपसे सवाल नहीं कर रहा हूं, मैं बस सोच रहा हूं कि अगली बार कहां देखना है मेरे पास एक समान सवाल है। –

+0

@Travis कोई समस्या नहीं है। असल में एमएसडीएन में, यह वास्तव में स्पष्ट नहीं है कि "कहां" उन एक्सटेंशन विधियों को परिभाषित किया गया है ... लेकिन आप 'IENumerable ' (जेनेरिक संस्करण) के लिए पृष्ठ पर सूची पा सकते हैं: http://msdn.microsoft.com/ एन-हम/पुस्तकालय/9eekhta0.aspx। एक छोटा आइकन है जो कहता है कि यह एक विस्तार विधि है ...और जब आप उनमें से किसी एक पर क्लिक करते हैं, तो आप देख सकते हैं कि यह किस नामस्थान में रहता है ... यानी, किसी भी LINQ एक्सटेंशन विधि का उपयोग करने के लिए, आपको अपनी फ़ाइल के शीर्ष पर 'System.Linq;' का उपयोग करना होगा। – tsimbalar

+0

ओह, और जिस तरह से मैं इसे जानता था, सिर्फ इसलिए है क्योंकि वीएस हमेशा 'सिस्टम.लिंक' का संदर्भ जोड़ता है और इंटेलिसेंस सिर्फ उन्हें सुझाव देता है :-)। हुड को हराकर, सभी "linq" क्वेरी-जैसी अभिव्यक्तियों को लिंक एक्सटेंशन विधियों की श्रृंखला में परिवर्तित कर दिया जाता है। – tsimbalar

0

आपको जो प्रश्न पूछने की आवश्यकता है वह है: "मुझे वास्तव में निष्पादित होने के लिए एसक्यूएल की आवश्यकता कब होगी?" LINQ में, यह स्थगित और तत्काल निष्पादन के बीच का अंतर है। IEnumerable<> लौटने वाली कोई भी विधि परिणाम प्राप्त करने के लिए क्वेरी निष्पादित करनी है। IQueryable<>, दूसरी ओर, क्वेरी के निष्पादन में देरी हो जाती है जब तक कि IEnumerable<> को वापस करने वाली विधि को इसके खिलाफ बुलाया जाता है। उदाहरण आपके द्वारा दी गई में, यह इतना है कि आप एक ही क्वेरी के बजाय चलाने दो की, एक IQueryable<> रूप GetAllNotesByUser फ़ंक्शन के परिणाम पारित करने के लिए तेजी से हो सकता है:

public static IQueryable<Account> GetAllNotesByUser(Guid UserId) 
{ 
    ... 
} 

स्थितियों में, जहां आप की गणना करने की जरूरत हो सकती है कोई अतिरिक्त हेरफेर किए बिना GetAllNotesByUser का परिणाम। उन मामलों में, याद रखें कि आप क्वेरी के निष्पादन को बल देने के लिए 'ToList()' को कॉल कर सकते हैं।

var result = GetAllNotesByUser(<guid>).ToList(); 
+0

' पर लागू होते हैं 'AsEnumerable' क्वेरी के निष्पादन को मजबूर नहीं करता है: http://stackoverflow.com/questions/3389855/am-i-misunderstanding-linq-to-sql-asenumerable – nawfal

+0

हां, आप सही हैं। ToList() निष्पादन को मजबूर करेगा। –

+0

नील, फिर अपना जवाब संपादित करें। यह अन्यथा एक downvote वारंट :) – nawfal

1

IEnumerable<T> बनाम IQueryable<T> पर एक अच्छा जवाब here नहीं है।

यदि आप विधि के कॉलर में सेट को और सीमित करना चाहते हैं, तो उदाहरण के लिए, जहां WHERE क्लॉज के साथ मैं IQueryable(Of T) का उपयोग करूंगा। अन्यथा मैं IEnumerable(Of T) का उपयोग करूंगा यदि सभी कॉलर्स जानते हैं कि उन्हें परिणाम पर एक ToList() करने की आवश्यकता है यदि वे इसे एक से अधिक बार फिर से चलाने की योजना बनाते हैं (अन्यथा आप डेटाबेस में एकाधिक कॉल करेंगे)। यदि कॉलर्स को पता नहीं है, तो शायद मैं ICollection(Of T) का उपयोग करूँगा और विधि में ToList() को निष्पादित करता हूं।