मैं कुछ समय के लिए 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 वाक्यविन्यास का उपयोग करके इसे कैसे प्राप्त कर सकता हूं?
आदर्श रूप में, मैं केवल LINQ से SQL का उपयोग करके समाधान ढूंढ रहा था। जैसा कि मैंने अपने उत्तर में उल्लेख किया है, मैं सीधे एडीओ.NET से SQL क्वेरी निष्पादित कर सकता हूं - लेकिन मैं LINQ का उपयोग करना चाहता था अन्य कोड के साथ स्थिरता के लिए एसक्यूएल। सुझाव के लिए धन्यवाद। – Martin
LINQ से SQL दृश्यों का समर्थन करता है। बस उन्हें डिज़ाइनर में खींचें और छोड़ दें। मुझे समझ में आया कि आप LINQ से SQL समाधान चाहते हैं। मैंने आपको उपयोग करने के लिए एक दृश्य बनाने का सुझाव दिया LINQ से SQL ढांचे तक। – rguerreiro