2011-06-20 12 views
8

मैं पहले कोड के साथ ईएफ 4 का उपयोग कर रहा हूं और दृढ़ता और एक सेवा परत के लिए एक भंडार है जो इसके साथ बातचीत करता है। मेरे पास एक सेवा परत विधि है जो मेरे भंडार पर एक IQueryable विधि को कॉल करती है और इकाइयों वाले एक आईनेमेरेबल को लौटाती है। मुझे कुल रिकॉर्ड गिनती वापस करने की भी आवश्यकता है ताकि मैं पेजिंग लिंक की गणना कर सकूं।मुझे अपनी सेवा परत विधि से कुल रिकॉर्ड गिनती और पायदान रिकॉर्ड के IENumable संग्रह का खुलासा कैसे करना चाहिए?

मैं अपने सेवा विधि से दोनों पूर्णांक और IEnumerable वापसी करना चाहिए?

  • गिनती
  • एक अलग वर्ग कुल पंक्ति एक संपत्ति
  • सेवा परत से बाहर पेजिंग LINQ क्वेरी ले जाएँ के रूप में गिनती भी शामिल है कि बनाएं कुल पंक्ति के लिए विधि पर एक बाहर पैरामीटर का उपयोग करें (बेनकाब सेवा परत पर रेपो)
  • सेवा परत है कि बस गिनती के लिए एक नई क्वेरी करता है पर एक पूर्ण अलग पद्धति बनाएं से IQueryable।

इन सभी को काम करना चाहिए, लेकिन कौन सा सबसे साफ है?

अद्यतन: यहां आर्किटेक्चर का कुछ स्पष्टीकरण दिया गया है। यदि यह गलत है, तो कृपया मुझे बेहतर तरीका बता (जैसे -, आदि सेवा परत के बजाय प्रस्तुति परत में पेजिंग करते हैं)

रेपो परत:

रिटर्न DbSet की IQueryable, डाटाबेस पहुँच सार प्रस्तुति परत से

सेवा परत:

फिल्टर करने के लिए करता है IQueryable पर एक LINQ क्वेरी और बस के रूप में छोड़ सकते हैं और लेने का उपयोग कर की जरूरत है और देता है एक IEnumerable (जा रहा भी पर सूची को सेट करने के लिए पेज आइटम प्राप्त

कॉल सेवा परत पर विधि (getPagedResults (फिल्टर, PAGENUMBER, pageSize))

यह दिखता है मैं भी होगा से: किसी भी DbContext जीवन मुद्दों

प्रस्तुति परत से बचने के लिए) वापसी कुल परिणाम प्राप्त करने के लिए एक अलग विधि जोड़ने की आवश्यकता है। यह सब एक कॉल में करने की उम्मीद कर रहा था।

मैं प्रस्तुति के लिए सभी रिकॉर्ड वापस नहीं लेना पसंद करूंगा और फिर पृष्ठ ... अक्षम लगता है।

+0

पर एक नजर डालें आप पहले से ही 'लौट रहे हैं तो IEnumerable ' वहाँ तुम सिर्फ प्रयोग नहीं करते '.Count()' कुछ विशेष कारण 'IEnumerable' पर है? क्या आप बस सबसेट को सामने के अंत में पेश कर रहे हैं? पेजिंग के लिए फ्रंट एंड ज़िम्मेदार नहीं होना चाहिए? – AllenG

+0

आपके द्वारा वापस आने वाले आईनेमरेबल, क्या इसमें सभी आइटम शामिल हैं? (गिनती के रूप में आइटमों का एक ही एनआर वापस आ जाएगा) – Magnus

+0

@ एलेनजी - मैं सर्विस लेयर में पेजिंग कर रहा था, फिर यूआई/कोडबेइंड उपभोक्ता को एक सूची लौटा रहा था। इस तरह से मैं अपने Dbcontext जीवनकाल के साथ किसी भी मुद्दे से बच सकते हैं। इसके अलावा, मुझे सभी रिकॉर्ड को सामने के अंत में भेजने की ज़रूरत नहीं है, फिर पेजिंग करें .. सीधे सेवा परत क्वेरी में आवश्यक रिकॉर्ड्स प्राप्त करेंगे। – jpshook

उत्तर

7

आप इन तरीकों

public static Pagination<TEntity> GetPagination<TEntity>(this Repository<TEntity> repository, 
    Expression<Func<TEntity, bool>> filter, int pageSize, int pageIndex) 
{ 
    var entities = repository.GetCollection(filter, pageSize, pageIndex); 
    var count = repository.Count(filter); 

    return new Pagination(entities, pageSize, pageIndex + 1, count); 
} 

इस तरह से आप स्वतंत्र रूप से GetCollection और Count तरीकों का पुन: उपयोग कर सकते हैं की दोनों का उपयोग करने के लिए इस

public class Repository<TEntity> 
{ 
    public IEnumerable<TEntity> GetCollection(Expression<Func<TEntity, bool>> filter, 
     int pageSize, int pageIndex) 
    { 
     return YourDbSet.Where(filter).OrderBy(sortExpression).Skip(pageSize * pageIndex).Take(pageSize); 
    } 

    public int Count(Expression<Func<TEntity, bool>> filter) 
    { 
     return YourDbSet.Where(filter).Count(); 
    } 
} 

की तरह कुछ करना तो आप एक विस्तार विधि लिख सकते हैं कर सकते हैं। आप कहां गतिशील स्थिति बना सकते हैं। मेरी answer

+0

मैं अभी भी सीख रहा हूं, इसलिए जब तक मैं जेनेरिक के आसपास अपना सिर नहीं ले लेता तब तक ठोस कार्यान्वयन तक टिकने की कोशिश करता हूं। – jpshook

+0

@ डेवलपर क्योंकि आप IQueryable का उपयोग कर रहे हैं आप पहले ही जेनिक्स का उपयोग कर रहे हैं। जेनेरिक पैरामीटर शिकायतकर्ता द्वारा अनुमानित हैं। इसलिए आपको उन्हें – Eranga

+0

देने की ज़रूरत नहीं है, यह एक अन्य प्रश्न का एक लिंक है जो मेरे वास्तुकला को दिखाता है ... बहुत सरल और ठोस: http://stackoverflow.com/questions/6416506/which-types-should-my-entity -framework-भंडार और सेवा परत-तरीकों-retur – jpshook

1

यदि Enumerable आप वापस लौट रहे हैं तो सभी आइटम शामिल हैं, तो मैं फ़ंक्शन से लौटने से पहले ToList() करता हूं। (इसके बाद आप Count पर बिना किसी लागत के कर सकते हैं) यदि फ़ंक्शन कुल का एक उप सेट लौटा रहा है (Skip और take का उपयोग करके) मैं कुल गणना प्राप्त करने के लिए एक अलग फ़ंक्शन जोड़ूंगा।

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

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