2011-03-10 16 views
7

के साथ LINQ groupby कथन मेरी क्वेरी का सिंटैक्स अच्छा है लेकिन आउटपुट नहीं है और यह वास्तव में अजीब है।कुंजी

| AppointID | UserID | AppointSet | AppointResolved | AppointStatus | AppointmentDatetime 
|  1  | 1 | 3/1/2011 | 3/1/2011  |  1   |  3/15/2011 
|  2  | 1 | 3/2/2011 | 3/5/2011  |  4   |  3/16/2011 
|  3  | 1 | 3/2/2011 | 3/11/2011  |  2   |  3/11/2011 
|  4  | 1 | 3/3/2011 | 3/7/2011  |  3   |  3/25/2011 

ApponintStatus, 2 के लिए भाग लिया है, एक बाइट जहां 1 सेट के लिए है 3 पुनर्निधारित के लिए है और 4 के लिए रद्द कर दिया गया है:

मैं निम्न तालिका है। AppointDatetime वह तारीख है जिसके लिए नियुक्ति निर्धारित की गई है।

जो मैं करने की कोशिश कर रहा हूं वह निम्नलिखित आउटपुट तैयार करता है जो दिन की गतिविधि को गिना जाता है।

| Date  | Set | Attended | Rescheduled | Cancelled | 
| 3/1/2011 | 1 |    |     |    | 
| 3/2/2011 | 2 |    |     |    | 
| 3/3/2011 | 1 |    |     |    | 
| 3/5/2011 |   |    |     |  1  | 
| 3/7/2011 |   |  1  |     |    | 
| 3/11/2011 |   |    |  1  |    | 

यह मेरे पास अब तक है। TheDate महीने मैं कर रहा हूँ के लिए क्वेरी के भीतर एक तारीख है (यानी, पारित मार्च 4 और मार्च तालिका लौटना चाहिए)

var r = from appnt in MyDC.LeadsAppointments 
     where appnt.UserID == TheUserID 
     where (appnt.AppointResolved.Year == TheDate.Year && appnt.AppointResolved.Month == TheDate.Month) || 
     (appnt.AppointSet.Year == TheDate.Year && appnt.AppointSet.Month == TheDate.Month) 
     group appnt by appnt.AppointResolved.Date into daygroups 
     select new ViewMonthlyActivityModel() 
     { 
      ViewDate = (from d in daygroups 
         select daygroups.Key.Date).First(), // Problem here: need to get dates for instances where an appointment is set but none are resolved 

      CountTotalSetOnDay = (from c in daygroups 
            where c.AppointSet.Date == daygroups.Key // Problem here 
            select c.AppointID).Count(), 

      CountAttendedOnDay = (from c in daygroups 
            where c.AppointResolved.Date == daygroups.Key.Date 
            where c.AppointStatus == 2 
            select c.AppointID).Count(), 

समस्या यह है कि CountTotalSetOnDay केवल उन सेट कर रहे हैं कि और की गिनती लौटा रहा है उसी दिन हल किया; दूसरी समस्या यह है कि व्यूडेट को सभी तिथियों को वापस करने की आवश्यकता है: ऐसी तिथियां हैं जब कोई अपॉइंटमेंट सेट नहीं होती है लेकिन अपॉइंटमेंट्स में भाग लिया जाता है, पुनर्निर्धारित या रद्द किया जाता है, और इसके विपरीत, नियुक्तियां सेट होने पर तिथियां होती हैं लेकिन कोई भी हल नहीं होता है।

अभी के लिए मैं इसे 2 प्रश्नों के साथ चला रहा हूं और मैं परिणामों में शामिल हूं: एक प्रश्न नियुक्तियों को सेट करता है और दूसरा नियुक्तियों को हल करता है। हालांकि, मैं अभी भी एक पठन में एक प्रश्न के साथ समाधान पर अटक गया हूँ।

कोई सुझाव?

धन्यवाद।

उत्तर

0

मुझे लगता है कि 2 पठन प्रश्नों के साथ समाधान ठीक काम करता है और अब के लिए खड़ा होगा।

1

आप AppointResolved.Date द्वारा समूहित कर रहे हैं।

इसलिए, दिन समूह में प्रत्येक प्रविष्टि के लिए, daygroups.Key == AppointResolved.Date, और c.AppointSet.Date == daygroups.Key जहां क्लॉज केवल आपको सभी प्रविष्टियां देगा जहां नियुक्ति उसी दिन सेट की गई थी जैसा कि इसे हल किया गया था।

ऐसा लगता है कि यदि आप अपने निर्दिष्ट लक्ष्य को प्राप्त करना चाहते हैं, तो आपको अपनी तालिका के किसी भी क्षेत्र में उल्लिखित सभी तिथियों को सूचीबद्ध करना होगा और उन्हें गिनना होगा।

उदाहरण के लिए, पर विचार करें:

var appointmentsTaken = (from appnt in GoyaDC.LeadsAppointments 
         where ... // your filters 
         group appnt by appnt.AppointSet.Date into daysset 
         select { Date = daysset.Key Count = daysset.Count() } 

यह आपको तिथियों की सूची देना चाहिए जहां नियुक्तियों जहां सेट, और प्रत्येक के लिए, उनमें से कितने।

+0

हां, यही समस्या है जिस पर मैं फंस गया हूं। और, ऐसे मामले भी होंगे जहां एक तारीख है जिसके लिए नियुक्ति सेट है लेकिन कोई अपॉइंटमेंट हल नहीं हुआ है। – frenchie

+0

यह भ्रमित है; यह var नियुक्तियां कहाँ जाती है? – frenchie

+0

यह आपको दिखाने के लिए एक उदाहरण है कि अपनी तालिका प्रविष्टियों से 'सेट' कॉलम कैसे प्राप्त करें। यदि आप अपनी आउटपुट टेबल में प्रत्येक दिनांक और प्रत्येक आवश्यक फ़ील्ड के लिए एक ही काम करते हैं, तो आपके पास अपने लक्ष्य को पूरा करने के लिए आवश्यक सभी जानकारी होनी चाहिए। – tugudum

2

आपको सेट दिनांक और हल तिथि दोनों का उपयोग करके समूह करना होगा। इसे from क्लॉज जोड़कर तारीखों के सेट के साथ जुड़ने और उन तिथियों के समूह के साथ आसानी से हासिल किया जा सकता है।

नीचे दी गई क्वेरी LINQ से ऑब्जेक्ट क्वेरी पर आधारित है। LINQ से SQL इस प्रकार की क्वेरी का समर्थन नहीं करता है, इसलिए आपको यह तय करना होगा कि क्या आप इसका उपयोग करना चाहते हैं जो क्लाइंट मशीन या सर्वर पर चलता है।

const byte statusAttended = 2; 
const byte statusRescheduled = 3; 
const byte statusCancelled = 4; 
var query = from a in MyDC.LeadsAppointments.AsEnumerable() 
      from date in new[] { a.AppointSet.Date, a.AppointResolved.Date } 
      where a.UserID == TheUserID 
       && date.Year == TheDate.Year 
       && date.Month == TheDate.Month 
      group a by date into g 
      orderby g.Key 
      let set = g.Distinct().ToList() 
      select new ViewMonthlyActivityModel 
      { 
       ViewDate = g.Key, 
       CountTotalSetOnDay = 
        set.Count(a => a.AppointSet.Date == g.Key), 
       CountTotalAttendedOnDay = 
        set.Count(a => a.AppointResolved.Date == g.Key 
           && a.AppointStatus == statusAttended), 
       CountTotalRescheduledOnDay = 
        set.Count(a => a.AppointResolved.Date == g.Key 
           && a.AppointStatus == statusRescheduled), 
       CountTotalCancelledOnDay = 
        set.Count(a => a.AppointResolved.Date == g.Key 
           && a.AppointStatus == statusCancelled), 
      }; 

एक पूरी तरह से LINQ एसक्यूएल का हल नहीं है (साफ) है कि काम करना चाहिए के लिए नहीं तो, आप इस कोशिश कर सकते हैं। ऐसा करने के लिए एक अच्छा तरीका हो सकता है लेकिन मुझे इसके बारे में पता नहीं है।

const byte statusAttended = 2; 
const byte statusRescheduled = 3; 
const byte statusCancelled = 4; 
var query = from a in MyDC.LeadsAppointments 
      let setDate = from aa in MyDC.LeadsAppointments 
          where aa.AppointID == a.AppointID 
          select aa.AppointSet.Date 
      let resolvedDate = from aa in MyDC.LeadsAppointments 
           where aa.AppointID == a.AppointID 
           select aa.AppointResolved.Date 
      from date in setDate.Concat(resolvedDate) 
      where a.UserID == TheUserID 
       && date.Year == TheDate.Year 
       && date.Month == TheDate.Month 
      group a by date into g 
      orderby g.Key 
      let set = g.Distinct() 
      select new ViewMonthlyActivityModel 
      { 
       ViewDate = g.Key, 
       CountTotalSetOnDay = 
        set.Count(a => a.AppointSet.Date == g.Key), 
       CountTotalAttendedOnDay = 
        set.Count(a => a.AppointResolved.Date == g.Key 
           && a.AppointStatus == statusAttended), 
       CountTotalRescheduledOnDay = 
        set.Count(a => a.AppointResolved.Date == g.Key 
           && a.AppointStatus == statusRescheduled), 
       CountTotalCancelledOnDay = 
        set.Count(a => a.AppointResolved.Date == g.Key 
           && a.AppointStatus == statusCancelled), 
      }; 
+0

चीजों को आजमा रहा हूं, मैंने इसका परीक्षण और पुन: प्रयास किया लेकिन यह डमी डेटा के खिलाफ सही परिणाम नहीं लौटा रहा था। मुझे नहीं पता क्यों। – frenchie

+0

@frenchie: इनमें से किसी के बारे में क्या सही नहीं है? आपके नमूना डेटा के साथ, यह आउटपुट से मेल खाता है (भाग लेने और पुनर्निर्धारित तिथियों के साथ स्वैप किए गए)। क्या ऐसे मामले हैं जिन्हें आपने छोड़ा था? –

+0

मुझे नहीं पता कि यह क्यों काम नहीं कर रहा है, लेकिन जब मैं नमूना डेटा के खिलाफ क्वेरी के आउटपुट का परीक्षण करता हूं, तो परिणाम अलग होते हैं। उदाहरण के लिए, CountTotalSetDay पर, मेरा सभी नमूना डेटा प्रत्येक दिन के लिए 16 की गणना दिखाने के लिए डिज़ाइन किया गया है और इस क्वेरी के साथ मुझे प्रत्येक दिन 40 की गिनती मिल रही है। मैं जो प्रश्न एकत्र करता हूं वह ठीक काम करता है। यह पहले सभी सेट, फिर अन्य सभी मामलों को प्राप्त करता है, और फिर दोनों को linq-to-object क्वेरी के साथ जोड़ता है। हां, यह 2 पढ़ता है लेकिन इस पल के लिए मैं इसे छोड़ने जा रहा हूं। आपका कोड दिखाता है कि कैसे "चलो" कथन काम करता है और इससे मुझे किसी और चीज के लिए मदद मिली है। धन्यवाद। – frenchie

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