2009-04-23 15 views
9

मैं कुछ समय के लिए LINQ से SQL के साथ .kip() और .Take() एक्सटेंशन विधियों का उपयोग कर रहा हूं, लेकिन सभी स्थितियों में मैंने हमेशा इसका उपयोग किया है एक एकल तालिका - जैसे:LINQ से SQL पेजिंग

database.Users.Select(c => c).Skip(10).Take(10); 

मेरे समस्या यह है कि मैं अब समग्र सेट पर एक से अधिक तालिकाओं से परिणामों के एक सेट पेश कर रहा हूँ और मैं चाहता हूँ पृष्ठ पर (और अभी भी डीबी पर पेजिंग का लाभ मिलेगा) है ।

मेरे इकाई मॉडल इस तरह दिखता है:

एक अभियान [कई है] समूहों, एक समूह [है कई] संपर्क

इस

तरह डेटाबेस में एक रिश्ते के माध्यम से मॉडलिंग की है अभियान -> अभियान टू ग्रुप मैपिंग -> समूह -> ग्रुपटॉन्क्टैक्ट मैपिंग -> संपर्क

मुझे डेटा संरचना उत्पन्न करने की आवश्यकता है lding एक अभियान के विवरण और भी CampaignToGroupMapping माध्यम से अभियान में जुड़े प्रत्येक संपर्क की एक सूची, यानी

Campaign 
    CampaignName 
    CampaignFrom 
    CampaignDate 
    Recipients 
     Recipient 1 
     Recipient 2 
     Recipient n... 

मैं में प्रत्येक समूह से संपर्कों के सेट परियोजना के लिए .SelectMany का उपयोग कर एक LINQ क्वेरी लिखने की कोशिश की थी उम्मीदवार में एक रैखिक डेटा सेट, मैं कर सकता था .किप() .केक() से।

मेरे प्रयास किया गया था:

var schedule = (from c in database.Campaigns 
       where c.ID == highestPriority.CampaignID 
       select new PieceOfCampaignSchedule 
       { 
        ID = c.ID, 
        UserID = c.UserID, 
        Name = c.Name, 
        Recipients = c.CampaignGroupsMappings.SelectMany(d => d.ContactGroup.ContactGroupMappings.Select(e => new ContactData() { /*Contact Data*/ }).Skip(c.TotalSent).Take(totalRequired)).ToList() 

       }).SingleOrDefault(); 

समस्या यह है कि पेजिंग (संबंध छोड़ें() और ले लो()) प्रत्येक समूह, नहीं पूरे डेटा सेट के लिए हो रहा है।

इसका मतलब यह है कि अगर मैं पैरामीटर totalRequired (.Take() के लिए पारित) के लिए मूल्य 200 का उपयोग करें और मैं 3 इस अभियान से जुड़े समूहों है, यह प्रत्येक समूह से 200 ले जाएगा - कुल डेटा से नहीं 200 अभियान से जुड़े प्रत्येक समूह से।

एसक्यूएल में, मैं इस एक प्रश्न के साथ इस तरह के रूप में प्राप्त कर सकते थे:

select * from 
(
    select [t1].EmailAddress, ROW_NUMBER() over(order by CampaignID desc) as [RowNumber] from contacts as [t1] 
    inner join contactgroupmapping as [t2] on [t1].ID = [t2].ContactID 
    inner join campaigngroupsmapping as [t3] on [t3].ContactGroupID = [t2].GroupID 
    where [t3].CampaignID = @HighestPriorityCampaignID 

) as [Results] where [Results].[RowNumber] between 500 and 3000 
इस क्वेरी के साथ

, मैं विशेष अभियान के साथ जुड़े प्रत्येक समूह से संपर्कों के संयुक्त सेट पर पेजिंग कर रहा हूँ। तो मेरा सवाल यह है कि, मैं इसके बजाय LINQ से SQL वाक्यविन्यास का उपयोग करके इसे कैसे प्राप्त कर सकता हूं?

उत्तर

0

कई टेबल से परिणाम एकत्र करने के लिए एक दृश्य का उपयोग करें और उसके बाद दृश्य

+0

आदर्श रूप में, मैं केवल LINQ से SQL का उपयोग करके समाधान ढूंढ रहा था। जैसा कि मैंने अपने उत्तर में उल्लेख किया है, मैं सीधे एडीओ.NET से SQL क्वेरी निष्पादित कर सकता हूं - लेकिन मैं LINQ का उपयोग करना चाहता था अन्य कोड के साथ स्थिरता के लिए एसक्यूएल। सुझाव के लिए धन्यवाद। – Martin

+1

LINQ से SQL दृश्यों का समर्थन करता है। बस उन्हें डिज़ाइनर में खींचें और छोड़ दें। मुझे समझ में आया कि आप LINQ से SQL समाधान चाहते हैं। मैंने आपको उपयोग करने के लिए एक दृश्य बनाने का सुझाव दिया LINQ से SQL ढांचे तक। – rguerreiro

4

से अधिक LINQ का उपयोग SQL क्वेरी आप आप इस करना होगा प्रदान की नकल करने के लिए:

var schedule = (from t1 in contacts 
       join t2 in contactgroupmapping on t1.ID equals t2.GroupID 
       join t3 in campaigngroupsmapping on t3.ContactGroupID = t2.GroupID 
       where t3.CampaignID = highestPriority.CampaignID 
       select new PieceOfCampaignSchedule 
       { 
        Email = t1.EmailAddress 
       }).Skip(500).Take(2500).ToList() 

आप पेज की कोशिश कर रहे अभियान, प्राप्तकर्ता, या दोनों पर?

+0

मुझे विश्वास है कि आपको छोड़ने और टेक का उपयोग करने से पहले ऑर्डर करने की आवश्यकता है। मेरे जैसा काम किया। –

0

मुझे लगता है कि आपका प्रयास वास्तव में करीब है; शायद मैं कुछ याद कर रहा हूँ, लेकिन मुझे लगता है कि तुम सिर्फ छोड़ें से पहले अपने SelectMany() बंद करने की आवश्यकता/लें:

Recipients = c.CampaignGroupsMappings.SelectMany(d => d.ContactGroup.ContactGroupMappings.Select(e => new ContactData() { /*Contact Data*/ })).Skip(c.TotalSent).Take(totalRequired).ToList() 

नोट: कहा, ")" के बाद "/ * संपर्क डाटा * /})" और हटा दिया ")" के बाद से "।ले लो (कुल आवश्यक) "