2012-03-22 25 views
6

का उपयोग कर गतिशील रूप से निर्मित क्वेरी में इकाई कुंजी द्वारा पंक्ति अनुक्रमणिका कैसे प्राप्त करें ग्रिड में, मुझे इसकी आईडी द्वारा रिकॉर्ड करने की आवश्यकता है। यही कारण है कि मुझे उपयोगकर्ता द्वारा फ़िल्टर किए गए और उपयोगकर्ता-क्रमबद्ध सेट में अपनी अनुक्रमणिका ढूंढनी होगी।एंटिटी फ्रेमवर्क

मैं LINQ to Entities के साथ काम कर रहा हूं। उपयोगकर्ता इनपुट के आधार पर क्वेरी गतिशील रूप से बनाई गई है।

तालिका में बहुत अधिक (10 से अधिक^5) रिकॉर्ड, निम्नलिखित Stack Overflow suggestion किसी भी अच्छे होने के लिए शामिल हैं:

Recs = Recs.Where(/* Filters */); 
Recs = Recs.OrderBy(/* Sort criteria */); 
Recs.AsEnumerable() 
     .Select((x,index) => new {RowNumber = index, Record = x}) 
     .Where(x=>x.Record.ID = 35); 

क्योंकि LINQ     संस्थाओं Select((entity, index) => ...) का समर्थन नहीं करता, इसे डाउनलोड करने की आवश्यकता होगी एसक्यूएल सर्वर से 250,000 रिकॉर्ड बस इतना है कि मैं पेज 25,000 दिखाने का फैसला कर सकता हूं।

वर्तमान में, मेरा सबसे आशाजनक विचार प्रत्येक प्रकार के मानदंड को फ़िल्टर में बदलने के लिए है। तो आरोही ऊंचाई से क्रमबद्ध व्यक्ति की अनुक्रमणिका ढूंढना छोटे व्यक्तियों को गिनना होगा (क्रमबद्ध मानदंड 'ऊंचाई आरोही' => फ़िल्टर 'ऊंचाई' + गिनती से कम)।

मुझे इस बात से कैसे संपर्क करना चाहिए? क्या यह समस्या पहले ही हल हो चुकी है? क्या .NET के लिए कोई लाइब्रेरी है जो मुझे यहां तक ​​कि आधा रास्ता लेती है?

+0

मैं काफी समझ में नहीं आता कि तुम क्या कह रहे हैं, आप कैसे किसी विशेष पृष्ठ पर एक विशेष चयन के लिए महत्वपूर्ण मूल्य को खोजने के लिए पूछ रहे हैं? या आप एक समय में एक ही पृष्ठ को पुनर्प्राप्त करने का सबसे अच्छा तरीका जानने का प्रयास कर रहे हैं? – CodingGorilla

+0

पंक्ति आईडी/इकाई कुंजी को देखते हुए, मैं उस विशेष पंक्ति की स्थिति को सॉर्ट और फ़िल्टर किए गए क्वेरी में ढूंढना चाहता हूं। मान लें कि उपयोगकर्ता नाम से व्यक्तियों को सॉर्ट करने का निर्णय लेता है, व्यक्ति सेट [{id: 11, नाम: "एमी"}, {id: 1, नाम "जो"}, {id: 2, नाम "जैक"}] है, आईडी 11 को मुझे इंडेक्स = 1, आईडी = 1 => इंडेक्स = 2, आईडी = 2 => इंडेक्स = 3 –

+0

ठीक है, इसलिए आपके पास डेटाबेस आईडी है, आपको यूआई में इसी पंक्ति को खोजने की ज़रूरत है, सही? यूआई, एएसपी.नेट, विनफॉर्म, डब्ल्यूपीएफ क्या है? – CodingGorilla

उत्तर

2

यहां एक रिकर्सिव फ़ंक्शन है जिसे आप पंक्ति संख्या को समझने के लिए कॉल कर सकते हैं। यदि आपके डेटाबेस रिकॉर्ड अक्सर बदल रहे हैं तो शायद यह काम नहीं करेगा, क्योंकि यह प्रत्येक बार आधे में खोज को कम करने वाले डेटाबेस को कई बार कॉल कर रहा है।

public static int FindRowNumber<T>(IQueryable<T> query, Expression<Func<T, bool>> search, int skip, int take) 
{ 
    if(take < 1) return -1; 
    if(take == 1) return query.Skip(skip).Take(take).Any(search) ? skip : -1;  


    int bottomSkip = skip; 
    int bottomTake = take/2; 
    int topSkip = bottomTake + bottomSkip; 
    int topTake = take - bottomTake; 

    if(query.Skip(bottomSkip).Take(bottomTake).Any(search)) 
    {   
    return FindRowNumber(query, search, bottomSkip, bottomTake); 
    } 
    if(query.Skip(topSkip).Take(topTake).Any(search)) 
    { 
    return FindRowNumber(query, search, topSkip, topTake); 
    } 

    return -1; 
} 

आप यह इतना की तरह फोन:

var query = ... //your query with ordering and filtering 
int rownumber = FindRowNumber(query, x => x.Record.ID == 35, 0, query.Count()); 
+0

यह एक दिलचस्प दृष्टिकोण है, लेकिन जितना तेज़ मैंने सवाल में सुझाव दिया है, जिसे मैंने अंततः ग्रिड फ़िल्टरिंग सिस्टम का उपयोग करके (एबी) द्वारा कार्यान्वित किया है। दूसरी ओर, यह मेरे स्निपेट में दृष्टिकोण से स्पष्ट रूप से बेहतर है। आपके परिश्रम के लिए धन्यवाद! –

+0

@ CălinDarie - आपको अपना उत्तर पोस्ट करना चाहिए और इसे स्वीकार करना चाहिए। मुझे लगता है कि लोगों से इसका फायदा होगा। – Aducci

संबंधित मुद्दे