मैं LINQ's कैसे लिखूँ?


93

.Skip()LINQ में SQL विधि के समतुल्य क्या है ?

उदाहरण के लिए: मैं एक विशिष्ट डेटाबेस तालिका से 1000-1100 पंक्तियों का चयन करना चाहूंगा।

क्या यह सिर्फ एसक्यूएल के साथ संभव है? या क्या मुझे पूरी तालिका का चयन करने की आवश्यकता है, फिर स्मृति में पंक्तियों को ढूंढें? मैं आदर्श रूप से इससे बचना चाहता हूं, यदि संभव हो तो, चूंकि तालिका काफी बड़ी हो सकती है।

जवाबों:


78

SQL Server 2005 और इसके बाद के संस्करण में आप ROW_NUMBER फ़ंक्शन का उपयोग कर सकते हैं । जैसे।

USE AdventureWorks;
GO
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader 
) 
SELECT * 
FROM OrderedOrders 
WHERE RowNumber BETWEEN 51 AND 60; --BETWEEN is inclusive

मेरे उत्तर की लिंक को थोड़ा और विस्तार से देखें। stackoverflow.com/questions/1744802/…
माइक एटलस

बीटा ५१ और ६० - यह समावेशी है।
ड्रू मिलर

1
लेकिन यह पहले सभी का चयन करेगा और फिर उस चयन में से केवल 10 सही लगेगा? या पहले क्वेरी / दृश्य में केवल 10 पहले से ही होंगे?
तद्ज

139

SQL सर्वर 2012 और इसके बाद के संस्करण इस वाक्यविन्यास को जोड़ा गया है:

SELECT *
FROM Sales.SalesOrderHeader 
ORDER BY OrderDate
OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY

11
ध्यान दें कि आपको OFFSET कमांड का उपयोग करने के लिए ORDER BY ___ का उपयोग करने की आवश्यकता है .... ऐसा नहीं है कि आपको कभी भी एक आदेश के बिना पेजिंग की कोशिश करनी चाहिए।
जेम्स हग

यह भी ध्यान दें कि 'नई' वाक्य रचना में अजीब तरह से @skip के साथ एक प्रदर्शन दंड रैखिक है! Row_number दृष्टिकोण में यह नहीं है (केवल अनुक्रमित क्रम पर परीक्षण किया गया है)। लो @Skip के बारे में 20 के लिए, नया सिंटैक्स, हालांकि row_number दृष्टिकोण से तेज है।
एसके राहन

22

LINQ to SQL एक ROW_NUMBER विंडोिंग फ़ंक्शन का उपयोग करके ऐसा करता है:

  SELECT a,b,c FROM 
   (SELECT a,b,c, ROW_NUMBER() OVER (ORDER BY ...) as row_number
    FROM Table) t0
   WHERE to.row_number BETWEEN 1000 and 1100;

यह काम करता है, लेकिन आदेश द्वारा से ROW_NUMBER का निर्माण करने की जरूरत हो सकती है आपकी क्वेरी में परिणाम सर्वर साइड और कारण प्रदर्शन की समस्याओं पर हल कर जा रहा है। यहां तक ​​कि जब कोई सूचकांक आदेश द्वारा आवश्यकता को पूरा कर सकता है, तो परिणाम वापस करने से पहले क्वेरी को अभी भी 1000 पंक्तियों को गिनना होगा। सभी अक्सर डेवलपर्स इसे भूल जाते हैं और सिर्फ 5 सैन्य पंक्तियों की तालिका पर एक अंकुश लगाने का नियंत्रण फेंक देते हैं और आश्चर्य करते हैं कि पहला पृष्ठ पिछले एक की तुलना में बहुत तेजी से क्यों लौटा है ...

कम नहीं, ROW_NUMBER () का उपयोग करना संभवतः उपयोग में आसानी और अच्छे प्रदर्शन के बीच सबसे अच्छा संतुलन है, बशर्ते आप यह सुनिश्चित करें कि आप सॉर्ट से बचते हैं (ORDER BY शर्त को एक सूचकांक द्वारा संतृप्त किया जा सकता है)।


1
अतिरिक्त प्रदर्शन जानकारी के लिए धन्यवाद, सावधान रहना होगा और इसका परीक्षण करना होगा।
रे

परीक्षण किया और मेरी आधी मिलियन पंक्ति तालिका के लिए, वह अंतिम पृष्ठ पहले पृष्ठ की तुलना में लगभग 7 गुना धीमा है। आदर्श नहीं, लेकिन मेरे लिए स्वीकार्य है।
रे

6

इसको आजमाओ:

select * from [Table-Name] order by [Column-Name] 
offset [Skip-Count] rows
FETCH NEXT [Take-Count] rows only

उदाहरण:

select * from Personals order by Id
offset 10 rows            --------->Skip 10
FETCH NEXT 15 rows only   --------->Take 15

4

यह करो:

चलाएँ .Skip (1000) .Take (100) को SQLQacacontext पर एक LINQ में और SQL आउटपुट को देखें। यह आपके लिए एक एसक्यूएल स्टेटमेंट जेनरेट करेगा जो आप बता रहे हैं।

यह उतना सुंदर नहीं होगा लेकिन यह काम पूरा कर लेता है।


2
जो नहीं पूछा जा रहा था।
रेवलेवेल्स

2

नहीं, लेकिन आप एक ही परिणाम प्राप्त करने के लिए MySQL के LIMIT क्लॉज (स्टैक ओवरफ्लो लिंक) का अनुकरण कर सकते हैं ।


1
एक स्वीकृत कोडप्रोजेक्ट लिंक, "ASP.NET में बड़े रिजल्ट्स का पेजिंग" के लिए स्वीकृत उत्तर की ओर इशारा करता है (नाम से अधिक SQL उन्मुख)।
रफिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.