2008-12-08 8 views
13

क्या लिंक क्वेरी में "पेजिंग" कार्यक्षमता का उपयोग करना संभव है? मान लीजिए कि मैं इस तरह कुछ एक्सएमएल करते हैं:न्यूबी LINQ प्रश्न: LINQ क्वेरीज़ में पेजिंग संभव है?

<Root> 
    <BetaSection> 
     <Choices> 
      <SetA> 
       <Choice id="choice1">Choice One</Choice> 
       <Choice id="choice2">Choice Two</Choice> 
       <Choice id="choice3">Choice Three</Choice> 
       . 
       . 
       . 
       <Choice id="choice48">Choice Forty-Eight</Choice> 
       <Choice id="choice49">Choice Forty-Nine</Choice> 
       <Choice id="choice50">Choice Fifty</Choice> 
      </SetA> 
     </Choices> 
    </BetaSection> 
</Root> 

अगर मैं पेजिंग कार्यक्षमता को लागू करना चाहता था, मैं ऐसा है कि मैं 11 वीं तत्व पर शुरू और 20 वीं को खत्म हो सकता है एक एक LINQ क्वेरी के लिए ऑफसेट प्रदान करने में सक्षम हो जाएगा तत्व? यदि हां, तो क्या क्वेरी एक्सएमएल की बजाय ऑब्जेक्ट्स की सूची थी, तो क्वेरी अलग होगी?

+0

linq द्वारा पृष्ठांकन संभव है। मैं नहीं जानता कि आप क्या हासिल करने का प्रयास करते हैं।यदि एक्सएमएल फ़ाइल में बड़े रिकॉर्ड सहेजे गए हैं और आप वहां से लिनक के साथ डेटा प्राप्त करना चाहते हैं तो यह संभव नहीं है। अधिकांश समय xml फ़ाइल पढ़ने के लिए xml दस्तावेज़ वर्ग का उपयोग करते हैं और फिर पूर्ण xml डेटा लोड स्मृति में लोड करते हैं। जब स्मृति में पूर्ण डेटा लोड होता है तो इसे पृष्ठांकन के रूप में नहीं माना जाना चाहिए। linq स्मृति से कुछ डेटा पढ़ेगा और वापस लौट आएगा ........ लेकिन इसे पेजिनेशन के रूप में नहीं कहा जा सकता है। मतलब है कि मैं केवल कुछ डेटा को स्मृति में लोड करूंगा जो मैं दिखाने या काम करने जा रहा हूं। – Thomas

उत्तर

18
var q = from X in Choices.Skip((page-1)*pageSize).Take(pageSize) 
     select X; 

अब, अगर आप उस में एक जहां खंड की जरूरत है, यह थोड़ा जटिल काम हो जाता है:

var q = (from X in Choices 
     where x.SomeField == SomeValue 
     select X).Skip((page-1)*pageSize).Take(pageSize); 
+1

आपके दूसरे मामले के लिए, भाषा वाक्यविन्यास में मिश्रण के बजाय विस्तार विधियों का उपयोग करना शायद आसान है: var q = Choices.Where (x => x.SomeField == someValue) .Skip ((पृष्ठ - 1) * पृष्ठ आकार)। टेक (पेजसाइज); –

+0

पहले मामले में आप 'एक्स इन' से 'एक्स' का चयन कर सकते हैं। –

+1

ऑर्डरबाय लागू करते समय यह काम करेगा? मेरा मतलब है कि मैं लिंकक को पहले ऑर्डरबी लागू करने की उम्मीद करता हूं और फिर छोड़ देता हूं और ले जाता है ... – Andry

2
var pagedData = aDataSource.Skip(20).Take(10); 

इस तरह, आप 20 तत्वों लंघन कर रहे हैं और लेने के अगले 10

1

"लो" और "छोड़ें" विस्तार के तरीकों इस के लिए प्रदान करते हैं।

myQueryable = myQueryable.Skip(10).Take(10); 
3

बिल्कुल - Skip() और Take() पेजिंग को प्राप्त है, और बहुत-बहुत सभी के द्वारा समर्थित हैं LINQ प्रदाताओं।

इस मामले में ऐसा लगता है कि आप LINQ-to-Xml का उपयोग कर रहे हैं, इसलिए निम्न बिट को अनदेखा करने के लिए स्वतंत्र महसूस करें - लेकिन सामान्य जानकारी के लिए: ध्यान दें कि यदि संग्रहीत प्रक्रिया के माध्यम से डेटा डेटाबेस से आ रहा है, तो यह है सर्वर पर पेज के लिए मुश्किल है। हालांकि, आप लिख सकते हैं (यानी पृष्ठ) "यूडीएफ" एस। LINQ-to-SQL यूडीएफ का समर्थन करता है ([FunctionAttribute] के माध्यम से), लेकिन इकाई फ्रेमवर्क नहीं। यदि आप स्वत: जेनरेट किए गए डेटाबेस क्वेरीज़ का उपयोग कर रहे हैं तो यह कोई मुद्दा नहीं है।

ध्यान दें कि एक्सएमएल के साथ, आप भी xpath के साथ एक बहुत कुछ कर सकता है - यहाँ XmlDocument का उपयोग कर:

foreach (XmlElement el in doc.SelectNodes(
    "/Root/BetaSection/Choices/SetA/Choice[position() > 11 and position() < 20]")) 
{ 
    Console.WriteLine(el.GetAttribute("id")); 
} 

या Skip()/Take() (अभी भी XmlDocument के साथ) के साथ:

foreach (var el in doc.SelectNodes(
    "/Root/BetaSection/Choices/SetA/Choice").Cast<XmlElement>() 
    .Skip(10).Take(10)) 
{ 
    Console.WriteLine(el.GetAttribute("id")); 
} 
+0

मैंने आपका कोड देखा है, लेकिन जब हम xml फ़ाइल को लोड और पढ़ने के लिए xmldoc क्लास के साथ काम करते हैं तो पहले सभी डेटा मेमोरी में लोड होते हैं। यदि सभी डेटा मेमोरी में लोड होते हैं और वहां से कुछ को छोड़कर काम करते हैं ... क्या यह वास्तव में पेजिनेशन के रूप में विचार करता है? पेजिनेशन का मतलब है कि मैं स्मृति में केवल कुछ डेटा लोड करूंगा जो मैं दिखाने या काम करने जा रहा हूं। – Thomas

1

हाँ, यह है । आप MSDN मंचों पर एक उचित डेटा स्रोत प्रारूप में एक्सएमएल और उसके बाद इस सूत्र से अधिक प्राप्त करने के लिए आप इसे कैसे लागू करने पर की क्षमता देने के लिए आवश्यक कदम प्रदान करना चाहिए होगा ...

MSDN - LINQ with pagination

3

लें Queryable.Skip और Queryable.Take विधियों के लिए एक नज़र।

इसके अलावा कि तरीकों आप इस तरह से कर सकते हैं के साथ पेजिंग के लिए यह उपयोगी extension methods,

देखें:

List<string> names = new List<string>(); 
names.AddRange(new string[]{"John","Frank","Jeff","George","Bob","Grant", "McLovin"}); 

foreach (string name in names.Page(2, 2)) 
{ 
    Console.WriteLine(name); 
} 
3

जेम्स कुरान यह सही है, तो आपको पुन: उपयोग के लिए एक विस्तार विधि बनाकर को सरल बनाने वाली बाद में।

आप कोड को भी एक ऑब्जेक्ट वापस करने के लिए संशोधित कर सकते हैं जो ट्रैक कर सकता है कि सूची में कुल कितने आइटम हैं और पेजसाइज और पेज इंडेक्स पर कितने पेज होना चाहिए।

public static IQueryable<T> ToPageOfList<T>(this IQueryable<T> source, int pageIndex, int pageSize) 
{ 
    return source.Skip(pageIndex * pageSize).Take(pageSize); 
} 

//Example 
var g = (from x in choices select x).ToPageOfList(1, 20);