2010-11-17 13 views
15

किसी से पता एसक्यूएल बयान करने के लिए एक LINQ लिखने के लिए कैसे एक मेज से हर nth पंक्ति वापस जाने के लिए? मुझे तेजी से उपयोगकर्ता स्कैनिंग के लिए एक पेजेड डेटा ग्रिड में प्रत्येक पृष्ठ के शीर्ष पर आइटम का शीर्षक प्राप्त करने की आवश्यकता है। तो अगर मैं पहले रिकॉर्ड है, तो उस के बाद हर 3 में से एक, निम्न नामों से चाहता था:LINQ टेबल

एमी, एरिक, जेसन, जो, जॉन, जोश, Maribel, पॉल, स्टीव, टॉम

मैं एमी, जो, Maribel, और टॉम मिल चाहते हैं।

मैंने यह किया जा सकता है ... LINQ एसक्यूएल बयान करने के लिए पहले से ही छंटाई और पृष्ठन के साथ संयोजन के रूप में ROW_NUMBER() एसक्यूएल समारोह आह्वान पर शक। मैं सिर्फ यह नहीं जानता कि प्रत्येक एनटी आइटम कैसे वापस प्राप्त करें। एसक्यूएल स्टेटमेंट WHERE ROW_NUMBER MOD 3 = 0 जैसा कुछ होगा, लेकिन मुझे सही SQL प्राप्त करने के लिए उपयोग करने के लिए LINQ कथन नहीं पता है।

+0

मैं इस एसक्यूएल एसक्यूएल – hunter

+0

वहाँ वास्तव में करने के लिए उत्पन्न LINQ के साथ किया जा सकता है अगर (कोई पता नहीं है,:

var data = db.ExecuteQuery<SomeObjectType>(@" SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS [__row] FROM [YourTable]) x WHERE (x.__row % 25) = 1"); 

तुम भी बाहर स्वैप सकता n) शुद्ध LINQ से SQL का उपयोग कर स्वीकृत उत्तर के मूल समाधान पर पहुंचने का एक तरीका प्रतीत नहीं होता है। मैंने कुछ विकल्प इस्तेमाल किए हैं। 1) एक ऐसा दृश्य बनाएं जो वांछित क्रम का उपयोग करके मूल तालिका और पंक्ति संख्या को भौतिक बनाता है, फिर LINQ से SQL का उपयोग यह देखने के लिए करें कि पंक्ति संख्या प्रत्येक एन पंक्तियों में एन के लिए शून्य शून्य है। 2) स्वीकृत उत्तर और ExecuteQuery का प्रयोग करें। अगर मैं जानता हूं कि प्री-मॉड सॉर्ट हमेशा एक जैसा होना चाहिए तो मैं पहला समाधान पसंद करता हूं। –

उत्तर

8

कभी कभी, TSQL जाने का रास्ता है। मैं ExecuteQuery<T> यहाँ का प्रयोग करेंगे: वास्तव में

var data = db.ExecuteQuery<SomeObjectType>(@" 
DECLARE @n int = 2 
SELECT * FROM 
(SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS [__row] 
FROM [YourTable]) x WHERE (x.__row % @n) = 1", n); 
1

वास्तव में यह करने के लिए एक आसान तरीका हो प्रतीत नहीं होता:

How do I add ROW_NUMBER to a LINQ query or Entity?

How to find the ROW_NUMBER() of a row with Linq to SQL

लेकिन हमेशा है:

peopleToFilter.AsEnumerable().Where((x,i) => i % AmountToSkipBy == 0) 

नोट: अभी भी यह चीजों के डेटाबेस पक्ष पर निष्पादित नहीं करता है!

+0

दुर्भाग्य से LINQ-to-SQL – Stephan

+0

अहह में 'कहां' का समर्थन नहीं किया गया है ... दुर्भाग्यवश आप सही हैं ... – diceguyd30

+0

मेरे उत्तर को कुछ उपयोगी (पढ़ा: वास्तव में काम करता है) – diceguyd30

1

बस एसक्यूएल को Linq के लिए एक विकल्प थोड़ा आसपास googling मैं नहीं मिला है (या अनुभवी) सीधे इस का समर्थन करने के।

ही एकमात्र विकल्प मैं पेशकश कर सकते हैं कि आप बाहर लिखा और फिर एसक्यूएल को Linq के माध्यम से sproc बुला उचित SQL क्वेरी के साथ एक संग्रहीत प्रक्रिया लिखना है। सबसे अच्छा समाधान नहीं है, खासकर अगर आपके पास कोई जटिल फ़िल्टरिंग चल रहा है।

+0

यह एक गैर-उत्तर – hunter

+0

कभी-कभी, जैसा कि इस मामले में लगता है, केवल जवाब यह है कि कोई जवाब नहीं है। एसक्यूएल से सीधे उपयोगकर्ता 'ROW_NUMBER() 'के रास्ते के बिना इस प्रकार का चयन असंभव है। – Stephan

+0

मुझे लगता है कि मैंने जो लिखा है, वैसे ही एक तरीका है, इसे किसी अन्य तरीके से इसके बारे में सोचना चाहिए। –

1

इस चाल करना होगा, लेकिन यह दुनिया में सबसे कुशल क्वेरी नहीं है:

var count = query.Count(); 
var pageSize = 10; 
var pageTops = query.Take(1); 
for(int i = pageSize; i < count; i += pageSize) 
{ 
    pageTops = pageTops.Concat(query.Skip(i - (i % pageSize)).Take(1)); 
} 
return pageTops; 

यह गतिशील (वें, 2 * n वें, 3 * n वें, आदि खींचने के लिए एक प्रश्न का निर्माण) दिए गए प्रश्न से मूल्य। यदि आप इस तकनीक का उपयोग करते हैं, तो संभवतया डेटाबेस को अस्वीकार करने से बचने के लिए, संभवतः आप Google परिणाम पृष्ठ (1-10, और अगला) के समान दस या बीस नामों की सीमा बनाना चाहते हैं। इसे पार्स करने का प्रयास करें।

आप बेहतर प्रदर्शन की जरूरत है, तो आप शायद एक संग्रहीत प्रक्रिया या आपकी क्वेरी का प्रतिनिधित्व करने के लिए एक दृश्य का उपयोग करने के लिए है, और संग्रहीत proc परिणाम या दृश्य के क्षेत्रों के हिस्से के रूप पंक्ति संख्या शामिल करेंगे।

3

यहाँ एक विकल्प है कि काम करता है, लेकिन यह जांच करते हुए कि यह व्यवहार में किसी भी प्रदर्शन के मुद्दों की जरूरत नहीं है लायक हो सकता है:

var nth = 3; 
var ids = Table 
      .Select(x => x.Id) 
      .ToArray() 
      .Where((x, n) => n % nth == 0) 
      .ToArray(); 

var nthRecords = Table 
        .Where(x => ids.Contains(x.Id)); 
+2

यह समस्या तब होगी जब तालिका 7000 पंक्तियों से अधिक हो, क्योंकि SQL सर्वर की पैरामीटर सीमा तक पहुंच जाएगी। –

4
एक समय की बात

, वहाँ ROW_NUMBER जैसी कोई चीज नहीं अभी तक था, और ऐसे प्रश्न संभव थे। निहारना!

var query = 
    from c in db.Customers 
    let i = (
    from c2 in db.Customers 
    where c2.ID < c.ID 
    select c2).Count() 
    where i%3 == 0 
    select c; 

यह उत्पन्न करता है निम्नलिखित Sql

SELECT [t2].[ID], [t2]. --(more fields) 
FROM (
    SELECT [t0].[ID], [t0]. --(more fields) 
(
     SELECT COUNT(*) 
     FROM [dbo].[Customer] AS [t1] 
     WHERE [t1].[ID] < [t0].[ID] 
     ) AS [value] 
    FROM [dbo].[Customer] AS [t0] 
    ) AS [t2] 
WHERE ([t2].[value] % @p0) = @p1 
+0

आपका कोड संकलित नहीं किया जा सका, मैं क्या ???? –

+0

कोड सी # में ठीक संकलित करता है। –

+0

आपका कंपाइलर हमारे साथ भिन्न हो सकता है ... –