2010-02-18 18 views
13

मैं अभी भी सिल्वरलाइट और आरआईए सेवाओं के साथ जमीन पर अपने पैरों को पाने की कोशिश कर रहा हूं, और निश्चित रूप से ग्रिड और बुद्धिमान पेजिंग जैसी कुछ और "मजेदार" चीजों से शुरू कर रहा हूं। मैं आरआईए सेवाओं से जुड़ सकता हूं (घर से उगाए गए ओआरएम का उपयोग कर, एल 2 एस या ईएफ नहीं), ग्रिड पर डेटा प्राप्त करें, और डेटापेजर से कनेक्ट करें। कम से कम प्रश्नों के लिए, डोमेन सेवा घर से उगाए गए ओआरएम के साथ अच्छी तरह से काम कर रही है। (फिर भी पूर्ण CRUD पर काम कर रहा।) हालांकि, अभी भी समस्याएं हैं:सिल्वरलाइट, डेटापेजर, आरआईए सेवाएं, और स्मार्ट पेजिंग

  1. उपयोगकर्ता आवेदन का समर्थन करने के लिए, मैं (उपयोगकर्ता नियंत्रित सॉर्टिंग और फ़िल्टरिंग की जरूरत है, स्मार्ट पेजिंग के अलावा केवल पंक्तियों के लिए क्वेरी चलाने प्रदर्शित करने के लिए आवश्यक) और समूहबद्ध।

  2. अब तक, मैंने इन क्षमताओं को बाहरी करने के लिए डेटाग्रिड या डेटापेजर में कुछ भी नहीं देखा है ताकि फ़िल्टरिंग, सॉर्टिंग और पेजिंग पैरामीटर उचित क्वेरी बनाने के लिए सर्वर को पास किए जा सकें।

  3. डेटासेट संभावित रूप से काफी बड़े हैं; मेरी तालिका जिसे मैंने प्रोटोटाइपिंग काम के लिए चुना है, कुछ ग्राहकों पर 35,000 प्रविष्टियां हो सकती हैं, और मुझे यकीन है कि अन्य टेबल इतनी बड़ी हैं कि मुझे किसी बिंदु पर निपटना होगा। तो "स्मार्ट पेजिंग" पहलू आवश्यक है।

विचार, सुझाव, मार्गदर्शन, और नरक ईंटों का स्वागत है।

उत्तर

11

ठीक है, मैंने इस के साथ खरपतवार में कुछ दिन बिताए हैं, और मुझे लगता है कि मुझे इस पर एक संभाल मिला है।

सबसे पहले, जादू का एक महत्वपूर्ण टुकड़ा। पेजिंग के लिए सही तरीके से काम करने के लिए, पेजर को कुल आइटम गिनती जाननी है, इससे कोई फर्क नहीं पड़ता कि वर्तमान क्वेरी द्वारा कितनी वस्तुओं को वापस किया गया था। यदि क्वेरी सब कुछ लौटाती है, तो आइटम गणना निश्चित रूप से लौटाई गई वस्तुओं की संख्या है। स्मार्ट पेजिंग के लिए, आइटम गिनती अभी भी उपलब्ध वस्तुओं की कुल है, हालांकि क्वेरी केवल वही दिखाई देती है जो प्रदर्शित होती है। फ़िल्टरिंग के साथ, फ़िल्टर की हर बार जब भी उपलब्ध वस्तुओं की कुल संख्या बदल जाती है।

सिल्वरलाइट डेटापेजर नियंत्रण में आइटमकाउंट नामक एक संपत्ति है। यह केवल पढ़ने योग्य है और XAML में डेटाबेस नहीं हो सकता है, या सीधे कोड में सेट नहीं किया जा सकता है। हालांकि, यदि पेजर युक्त उपयोगकर्ता नियंत्रण में डेटाकॉन्टेक्स्ट है जो IPagedCollectionView लागू करता है, तो डेटा संदर्भ ऑब्जेक्ट को PropertyChanged अधिसूचना के साथ एक आइटमकाउंट प्रॉपर्टी लागू करनी होगी, और डेटापैगर इसे स्वचालित रूप से चुनने लगता है।

दूसरा, मैं ब्रैड अब्राम के उत्कृष्ट series of blog posts on RIA Services की अत्यधिक अनुशंसा करता हूं, विशेष रूप से यह ViewModel पर है। इसमें पेजिंग और फ़िल्टरिंग कार्य करने के लिए आपको सबसे अधिक आवश्यकता होती है, हालांकि आइटम गणना के प्रबंधन पर महत्वपूर्ण टुकड़ा गुम है। उनके डाउनलोड करने योग्य नमूने में ModelViewViewModel (MVVM) को लागू करने के लिए एक बहुत अच्छा बुनियादी ढांचा भी शामिल है। धन्यवाद, ब्रैड!

तो यहां आइटम गिनती कार्य करने का तरीका बताया गया है। (यह कोड एक कस्टम ओआरएम को संदर्भित करता है, जबकि ब्रैड का कोड एंटिटी फ्रेमवर्क का उपयोग करता है, जबकि आप दोनों को आपके पर्यावरण में आपको जो चाहिए उसे समझ सकते हैं।)

सबसे पहले, आपके ORM को रिकॉर्ड गणना प्राप्त करने में सहायता करने की आवश्यकता है, आपके साथ और बिना फिल्टर। यहां मेरा डोमेन सेवा कोड है जो आरआईए सेवाओं को उपलब्ध कराता है:

[Invoke] 
public int GetExamCount() 
{ 
    return Context.Exams.Count(); 
} 

[Invoke] 
public int GetFilteredExamCount(string descriptionFilter) 
{ 
    return Context.Exams.GetFilteredCount(descriptionFilter); 
} 

नोट [आमंत्रण] विशेषता दें। आपको किसी भी डोमेन सेवा विधि के लिए इसकी आवश्यकता है जो एक इकाई या इकाई संग्रह नहीं लौटाता है।

अब व्यूमोडेल कोड के लिए। आपको निश्चित रूप से एक आइटमकाउंट चाहिए। (यह ब्रैड के उदाहरण से है।)

int itemCount; 
    public int ItemCount 
    { 
     get { return itemCount; } 
     set 
     { 
      if (itemCount != value) 
      { 
       itemCount = value; 
       RaisePropertyChanged(ItemCountChangedEventArgs); 
      } 
     } 
    } 

आपका LoadData विधि डेटा ग्रिड में प्रदर्शन के लिए पंक्तियों की वर्तमान सेट प्राप्त करने के लिए क्वेरी चलेंगे। (यह कस्टम अभी तक छँटाई लागू नहीं है, लेकिन है कि एक आसान अलावा है।)

EntityQuery<ExamEntity> query = 
     DomainContext.GetPagedExamsQuery(PageSize * PageIndex, PageSize, DescriptionFilterText); 
    DomainContext.Load(query, OnExamsLoaded, null); 

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

void OnCountCompleted(InvokeOperation<int> op) 
{ 
    ItemCount = op.Value; 
    TotalItemCount = op.Value; 
} 

ITEMCOUNT सेट के साथ, Datapager नियंत्रण यह उठाता है, और हम छानने और एक स्मार्ट क्वेरी जो करने के लिए केवल रिकॉर्ड रिटर्न के साथ पेजिंग है:

private void OnExamsLoaded(LoadOperation<ExamEntity> loadOperation) 
{ 
    if (loadOperation.Error != null) 
    { 
     //raise an event... 
     ErrorRaising(this, new ErrorEventArgs(loadOperation.Error)); 
    } 
    else 
    { 
     Exams.MoveCurrentToFirst(); 
     if (string.IsNullOrEmpty(DescriptionFilterText)) 
     { 
      DomainContext.GetExamCount(OnCountCompleted, null); 
     } 
     else 
     { 
      DomainContext.GetFilteredExamCount(DescriptionFilterText, OnCountCompleted, null); 
     } 
     IsLoading = false; 
    } 
} 

वहाँ भी मायने रखता है के लिए एक कॉलबैक विधि है प्रदर्शित हों!

LINQ क्वेरी को आसान बनाता है .किप() और। टेक()। कच्चे ADO.NET के साथ ऐसा करना कठिन है। मैंने सीएनक्यू-जेनरेटेड क्वेरी को अलग करके इसे कैसे किया है।

SELECT * FROM 
    (select ROW_NUMBER() OVER (ORDER BY Description) as rownum, * 
    FROM Exams as T0 WHERE T0.Description LIKE @description) as T1 
WHERE T1.rownum between @first AND @last ORDER BY rownum 

खंड "का चयन करें ROW_NUMBER() से अधिक (द्वारा विवरण आदेश) ROWNUM के रूप में" दिलचस्प हिस्सा है, क्योंकि कई लोग "से अधिक" का उपयोग अभी तक है। यह खंड पंक्ति संख्या निर्दिष्ट करने से पहले विवरण पर तालिका को टाइप करता है, और पंक्ति संख्याओं को आवंटित करने से पहले फ़िल्टर भी लागू किया जाता है। यह सॉर्टिंग और फ़िल्टरिंग के बाद बाहरी संख्या को पंक्ति संख्याओं पर फ़िल्टर करने की अनुमति देता है।

तो आरआईए सेवाओं और सिल्वरलाइट में फ़िल्टरिंग के साथ स्मार्ट पेजिंग है!

+3

जब मैं सामान्य कार्यों को बनाने वाले ढांचे के साथ इस तरह के मुद्दों पर आ जाता हूं, इस मामले में पेजिंग, यह चिंता का विषय है। आरआईए का उपयोग करने के लिए या आरआईए का उपयोग न करने के लिए सवाल है ... – sipwiz

+0

ठीक है, यह अभी के लिए एक खुला प्रश्न है। सिल्वरलाइट 3 और वीएस 2008 के लिए आरआईए सेवाएं काफी ज्यादा मृत हैं; जो उपलब्ध है वह सार्वजनिक बीटा है, जिसे बढ़ाया नहीं जाएगा और केवल दिसंबर के माध्यम से समर्थित होगा। इसलिए सिल्वरलाइट 4 और वीएस 2010 के लिए आरआईए सेवाएं विकल्प है। यह अब आरसी 2 स्थिति में है; जैसे ही यह रिलीज स्थिति हिट करता है, मैं इसे देखता हूं। एफडब्ल्यूआईडब्ल्यू, ब्रैड अब्राम ने सिल्वरलाइट डाटाग्रिड को पेजिंग करने दिया है, लेकिन अभी भी कस्टम फ़िल्टरिंग का मुद्दा है, और यही शुरुआत में मेरे लिए आरआईए सेवाओं को वास्तव में मार डाला। हमें सर्वर पर फ़िल्टर करने में सक्षम होना चाहिए। –

4

यहाँ त्वरित और गंदी समाधान है (है कि मैं के लिए चला गया):

बस अपने ViewModel करने के लिए अपने DomainDataSource के लिए कदम! किया हुआ!

बिल्कुल testability और शायद कुछ अन्य सीमाओं मैं अभी तक पता नहीं लगाया लिए महान नहीं हो सकता है, लेकिन व्यक्तिगत रूप से मैंsomething better comes along जब तक कि के बारे में परवाह नहीं है।

अपने ViewModel अंदर सिर्फ डेटा स्रोत का दृष्टांत:

// Feedback DataSource 
_dsFeedback = new DomainDataSource(); 
_dsFeedback.DomainContext = _razorSiteDomainContext; 
_dsFeedback.QueryName = "GetOrderedFeedbacks"; 
_dsFeedback.PageSize = 10; 
_dsFeedback.Load(); 

और एक bindable संपत्ति प्रदान करते हैं:

private DomainDataSource _dsFeedback { get; set; } 
public DomainDataSource Feedback 
{ 
    get 
    { 
     return _dsFeedback; 
    } 
} 

और अपने XAML करने के लिए अपने DataPager जोड़ें:

<data:DataPager Grid.Row="1" 
        HorizontalAlignment="Stretch" 
        Source="{Binding Feedback.Data}" 
        Margin="0,0,0,5" /> 

    <data:DataGrid ItemsSource="{Binding Feedback.Data}"> 


पीएस। उपरोक्त लिंक पेज से 'फ्रेंकोइस' के लिए धन्यवाद। मुझे यह भी एहसास नहीं हुआ कि जब तक मैंने आपकी टिप्पणी नहीं देखी, मैं XAML से डोमेनडेटा स्रोत निकाल सकता हूं!

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