एसक्यूएल टॉप या लिमिट / ओएफएसईटीटी के बराबर एसक्यूएल क्या है?


जवाबों:


146

VB में:

from m in MyTable
take 10
select m.Foo

यह मानता है कि MyTable ने IQueryable को लागू किया है। आपको DataContext या किसी अन्य प्रदाता के माध्यम से एक्सेस करना पड़ सकता है।

यह भी मानता है कि फू माईटेबल में एक कॉलम है जो एक संपत्ति के नाम पर मैप हो जाता है।

अधिक विवरण के लिए http://blogs.msdn.com/vbteam/archive/2008/01/08/converting-sql-to-linq-part-7-union-top-subqueries-bill-horst.aspx देखें ।


127
यह C # में काम नहीं करता है, कोई अभिव्यक्ति नहीं है। आपको टेक () विधि का उपयोग करने की आवश्यकता है।
एडम लाससेक

10
तकनीकी रूप से, प्रश्नकर्ता ने लिनक को एसक्यूएल के लिए कहा, इसलिए वीबी एक व्यवहार्य धारणा है। उस ने कहा, अलसेक, मैं खुद # आदमी हूं और आपका जवाब पसंद करता हूं। :-)
डेविड एपरट

3
ठीक है, आप उदाहरण हैं कि C # LINQ में लिखा गया था यही कारण है कि मैंने इसे इंगित किया।
एडम लाससेक

3
2 समस्याएं: 1) यह VB में ठीक काम करता है। C # में आपके पास टेक विधि है। 2) टेक क्लाइंट में काम करता है, डीबी में नहीं, इसलिए यदि आपके पास बड़ा रिजल्ट है तो आप डीबी से क्लाइंट के लिए यह सब प्राप्त करना चाहेंगे!
युकी

8
सराहना करें यह कुछ साल पुराना है, लेकिन उन लोगों के लिए जो यहां बस रहे हैं, यह ध्यान देने योग्य है कि ".Take (x)" आपको ".Select ()" या ".ToList ()" को "के रूप में" करने से पहले प्रदर्शित होना चाहिए। .Take (x) "केवल उत्पन्न SQL में शामिल किया जाएगा यदि यह परिणाम जारी करने से पहले है। यदि यह इसके बाद प्रकट होता है, तो यह परिणाम सेट होने के बाद एक बार किया जाएगा और इसलिए यह एक पुराना पुराना Linq कथन है!
बर्टी

248

विधि का उपयोग करें :

var foo = (from t in MyTable
           select t.Foo).Take(10);

VB LINQ में एक अभिव्यक्ति है:

Dim foo = From t in MyTable _
          Take 10 _
          Select t.Foo

प्रलेखन से:

Take<TSource>sourceतत्वों की पैदावार होने तक countतत्वों की गणना और पैदावार होती है या sourceइसमें अधिक तत्व नहीं होते हैं। यदि countतत्वों की संख्या से अधिक है source, तो सभी तत्व sourceवापस आ जाते हैं।


13
LINQ में C # और VB के बीच के छोटे अंतर कष्टप्रद हैं। C # में VB की तरह अभिव्यक्ति क्यों नहीं है? जो एक ओवरसाइट की तरह लगता है। और वीबी की अनाम सदस्यता की कमी लैम्ब्डा को बहुत कम उपयोगी बनाती है।
एडम लाससेक

बस मैं +1 के लिए क्या देख रहा था
jasonco

1
+1 बस मुझे जो चाहिए था, वह भी। और एफडब्ल्यूआईडब्ल्यू, ऐसा लगता है कि केवल दस रिकॉर्ड वास्तव में पाइप के नीचे आते हैं। मेरा चयन अन्यथा एक बड़ी मात्रा में डेटा लौटाएगा , एक दर्दनाक देरी के बाद OutOfMemoryException को फेंकने के लिए पर्याप्त । टेक ( प्रबंधनीय-मात्रा ) के साथ, कोई देरी नहीं, कोई अपवाद नहीं।
बॉब कॉफमैन

VB में अब एक टेक () विधि भी है। मुझे राशि लेने के लिए एक चर का उपयोग करना था, और अभिव्यक्ति ने काम नहीं किया, जबकि विधि ने किया।
डेव जॉनसन

33

Take(int n)विधि का प्रयोग करें :

var q = query.Take(10);

25

ओपी ने वास्तव में ऑफसेट का उल्लेख किया है, इसलिए पूर्व के लिए। यदि आप 30 से 60 तक आइटम प्राप्त करना चाहते हैं, तो आप ऐसा करेंगे:

var foo = (From t In MyTable
       Select t.Foo).Skip(30).Take(30);

ऑफ़सेट के लिए "स्किप" विधि का उपयोग करें।
सीमा के लिए "टेक" विधि का उपयोग करें।


13

@ ज्ञानी: यहाँ मेरी पहली टिप्पणी आपके नमूने के बारे में है;)

मुझे लगता है कि अगर आप ऐसा करते हैं, तो आप 4 लेना चाहते हैं, तो इन 4 पर सॉर्ट अप्लाई करें।

var dados =  from d in dc.tbl_News.Take(4) 
                orderby d.idNews descending
                select new 
                {
                    d.idNews,
                    d.titleNews,
                    d.textNews,
                    d.dateNews,
                    d.imgNewsThumb
                };

IdNews उतरते हुए और फिर 4 लेते हुए पूरे tbl_News को छाँटने से अलग

var dados =  (from d in dc.tbl_News
                orderby d.idNews descending
                select new 
                {
                    d.idNews,
                    d.titleNews,
                    d.textNews,
                    d.dateNews,
                    d.imgNewsThumb
                }).Take(4);

नहीं ? परिणाम अलग हो सकते हैं।


5

यह C # में अच्छा काम करता है

var q = from m in MyTable.Take(10)
        select m.Foo

4

मुझे यह पसंद है:

 var dados =  from d in dc.tbl_News.Take(4) 
                orderby d.idNews descending

                select new 
                {
                    d.idNews,
                    d.titleNews,
                    d.textNews,
                    d.dateNews,
                    d.imgNewsThumb
                };

7
इस दृष्टिकोण के साथ समस्या यह है कि आप 4 लेंगे और फिर उन्हें ऑर्डर करेंगे, जब मुझे संदेह है कि आप वास्तव में क्या चाहते हैं तो शीर्ष 4 परिणाम प्राप्त करना है। आदेश के बाद आपको टेक करने की जरूरत है, यान्स टिप्पणी देखें।
रसेल ट्रॉयवेस्ट


3

चाहे टेक क्लाइंट पर होता है या डीबी पर निर्भर करता है कि आप टेक ऑपरेटर को कहां लगाते हैं। यदि आप क्वेरी को गणना करने से पहले इसे लागू करते हैं (यानी इससे पहले कि आप इसे फ़ॉर्वर्ड में उपयोग करें या इसे एक संग्रह में परिवर्तित करें) तो परिणाम "शीर्ष n" SQL ऑपरेटर db को भेजा जाएगा। यदि आप SQL प्रोफाइलर चलाते हैं तो आप इसे देख सकते हैं। यदि आप ग्राहक पर होने वाली क्वेरी की गणना करने के बाद इसे लागू करते हैं, क्योंकि LINQ को इसके माध्यम से गणना करने के लिए डेटाबेस से डेटा पुनः प्राप्त करना होगा।


2

बिना छांटे के डाटाबेस का डेटा लेना रैंडम टेक के समान है


यह निश्चित रूप से यादृच्छिक नहीं है, हालांकि परिणाम दोहराए जाने की गारंटी नहीं है, लेकिन कई बार आप ऐसा करना चाहते हैं, खासकर परीक्षण में।
शुभ अंक

2
Array oList = ((from m in dc.Reviews
                           join n in dc.Users on m.authorID equals n.userID
                           orderby m.createdDate descending
                           where m.foodID == _id                      
                           select new
                           {
                               authorID = m.authorID,
                               createdDate = m.createdDate,
                               review = m.review1,
                               author = n.username,
                               profileImgUrl = n.profileImgUrl
                           }).Take(2)).ToArray();

0

मुझे टेक (n) विधि का उपयोग करना था, फिर सूची में बदलना, एक आकर्षण की तरह काम किया:

    var listTest = (from x in table1
                     join y in table2
                     on x.field1 equals y.field1
                     orderby x.id descending
                     select new tempList()
                     {
                         field1 = y.field1,
                         active = x.active
                     }).Take(10).ToList();

0

इस तरह से यह मेरे लिए काम किया:

var noticias = from n in db.Noticias.Take(6)
                       where n.Atv == 1
                       orderby n.DatHorLan descending
                       select n;

मैंने अभी आपकी पोस्ट को संपादित किया है, मैंने पुर्तगाली भाषा का अंग्रेजी में अनुवाद किया है, क्योंकि यह साइट केवल अंग्रेजी भाषा है (यह चर नामों पर लागू नहीं होती है, इसीलिए मैंने इन्हें नहीं बदला है)।
वाका

माफ़ करना ! मुझे एहसास नहीं था, मुझे लगा कि मैं ब्राजील के स्टैक्वेरफ्लो में हूं। क्षमा करें
ग्लैडसन रीस

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.