मैं एक linq क्वेरी से कुल योग वापस करना चाहता हूं, मैं 2 पैरामीटर में पास करता हूं जो क्वेरी में शामिल/शामिल नहीं हो सकता है।

संगठन आईडी - पूर्णांक

रिपोर्ट प्रकार - int

तो दो प्रश्न:

  1. मैं नीचे दी गई क्वेरी को कैसे अपडेट कर सकता हूं ताकि यदि OrgId = 0 तो संगठन फ़ील्ड (सभी को वापस करें) को अनदेखा करें?

  2. LocumClaimTF सही/गलत/दोनों हो सकता है, यदि दोनों तो इस क्षेत्र के लिए जहां क्वेरी को अनदेखा करते हैं।

यहाँ मैंने अब तक क्या किया है, यह काम कर रहा है लेकिन मुझे कुशल के लिए कुछ चाहिए।

            // Using reportType set preferences for LocumClaimTF
            bool locumClaimTF1, locumClaimTF2 = false;
            if (reportType == 0)
            {
                locumClaimTF1 = false;
                locumClaimTF2 = false;
            }
            else if (reportType == 1)
            {
                locumClaimTF1 = true;
                locumClaimTF2 = true;
            }
            else // 2
            {
                locumClaimTF1 = true;
                locumClaimTF2 = false;
            }

            if (OrgID != 0) // Get by OrgID
            {
                return _UoW.ShiftDates.Get(x => x.shiftStartDate >= StartDate && x.shiftEndDate <= EndDate)
             .Where(x => x.Shift.LocumClaimTF == locumClaimTF1 || x.Shift.LocumClaimTF == locumClaimTF2)
             .Where(x => x.Shift.organisationID == OrgID)
             .GroupBy(s => s.assignedLocumID)
                 .Select(g => new dataRowDTO { dataLabel = string.Concat(g.FirstOrDefault().User.FullName), dataCount = g.Count(), dataCurrencyAmount = g.Sum(sd => sd.shiftDateTotal.Value) }
                ).Sum(g=>g.dataCurrencyAmount);
            }
            else // Ignore OrgID - Get ALL Orgs
            {
                return _UoW.ShiftDates.Get(x => x.shiftStartDate >= StartDate && x.shiftEndDate <= EndDate)
               .Where(x => x.Shift.LocumClaimTF == locumClaimTF1 || x.Shift.LocumClaimTF == locumClaimTF2)
               .GroupBy(s => s.assignedLocumID)
                  .Select(g => new dataRowDTO { dataLabel = string.Concat(g.FirstOrDefault().User.FullName), dataCount = g.Count(), dataCurrencyAmount = g.Sum(sd => sd.shiftDateTotal.Value) }
                  ).Sum(g => g.dataCurrencyAmount);
            }

मैं डेटा frm प्राप्त करने के लिए कार्य पैटर्न की इकाई के साथ EF का उपयोग कर रहा हूँ

0
Dez79 24 अक्टूबर 2019, 18:34

1 उत्तर

सबसे बढ़िया उत्तर

ऊपर से नीचे तक कुछ बातें दिमाग में आती हैं:

बूलियन को संभालने के लिए

bool locumClaimTF1 = (reportType == 1 || reportType == 2);
bool locumClaimTF2 = (reportType == 1);

हालाँकि, मैंने क्वेरी में जो पढ़ा है, यदि रिपोर्ट का प्रकार 1 या 2 है, तो आप चाहते हैं कि Shift का LocumClaimTF ध्वज सत्य हो। यदि ऐसा है, तो आप बूलियन झंडे को भूल सकते हैं और अपनी स्थिति में रिपोर्ट टाइप का उपयोग कर सकते हैं।

अगला, क्वेरी लिखने के लिए, आप सशर्त रूप से कंपोज़ कर सकते हैं जहाँ क्लॉज़ हैं। धाराप्रवाह लिंक सिंटैक्स के बारे में यह एक अच्छी बात है। हालाँकि, आइए अस्थायी रूप से UoW के बजाय एक नियमित DbContext के साथ शुरू करें क्योंकि यह कुछ जटिलताओं और प्रश्नों का परिचय देगा, जिन पर आपको गौर करने की आवश्यकता होगी। (मैं इसे नीचे कवर करूंगा)

using (var context = new ApplicationDbContext()) // <- insert your DbContext here...
{
    var query = context.ShiftDates
       .Where(x => x.shiftStartDate >= StartDate 
           && x.shiftEndDate <= EndDate);
    if (reportType == 1 || reportType == 2)
       query = query.Where(x.Shift.LocumClaimTF);
    if (OrgId > 0)
       query = query.Where(x => x.Shift.organisationID == OrgID);

    var total = query.GroupBy(s => s.assignedLocumID)
        .Select(g => new dataRowDTO 
        { 
           dataLabel = tring.Concat(g.FirstOrDefault().User.FullName), 
           dataCount = g.Count(), 
           dataCurrencyAmount = g.Sum(sd => sd.shiftDateTotal.Value) 
        })
        .Sum(g=>g.dataCurrencyAmount);
}

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

    var total = query.Sum(x => x.shiftDateTotal.Value);

तो पूरी बात कुछ इस तरह दिखेगी:

using (var context = new ApplicationDbContext()) // <- insert your DbContext here...
{
    var query = context.ShiftDates
       .Where(x => x.shiftStartDate >= StartDate 
           && x.shiftEndDate <= EndDate);
    if (reportType == 1 || reportType == 2)
       query = query.Where(x.Shift.LocumClaimTF);
    if (OrgId > 0)
       query = query.Where(x => x.Shift.organisationID == OrgID);

    var total = query.Sum(x => x.shiftDateTotal.Value);
    return total;
}

कार्य की इकाई पर वापस जाएं: इस पैटर्न का उपयोग करते समय मुख्य विचार यह सुनिश्चित करना है कि यह Get कॉल बिल्कुल IQueryable<TEntity> वापस आना चाहिए। यदि यह कुछ और लौटाता है, जैसे IEnumerable<TEntity> तो आपको महत्वपूर्ण प्रदर्शन समस्याओं का सामना करना पड़ रहा है क्योंकि यह डेटाबेस में कुशल क्वेरी बनाने के लिए विस्तारित की जा सकने वाली चीज़ों के बजाय स्मृति में लोड की गई संस्थाओं की भौतिक सूची लौटाएगा। यदि Get विधि IQueryable वापस नहीं आती है, या इसके भीतर कहीं भी ToList जैसी विधियां हैं, उसके बाद AsQueryable() हैं, तो बाकी देव टीम के साथ बात करें क्योंकि आप सचमुच लैंड माइन के कोड/ईएफ समकक्ष पर खड़े हैं। यदि यह IQueryable<TEntity> (IQueryable<ShiftDate> इस मामले में) लौटाता है, तो आप इसे वापस उपरोक्त क्वेरी में बदल सकते हैं:

var query = _UoW.ShiftDates.Get(x => x.shiftStartDate >= StartDate && x.shiftEndDate <= EndDate);
if (reportType == 1 || reportType == 2)
   query = query.Where(x.Shift.LocumClaimTF);
if (OrgId > 0)
   query = query.Where(x => x.Shift.organisationID == OrgID);

var total = query.Sum(x => x.shiftDateTotal.Value);
return total;
1
Steve Py 25 अक्टूबर 2019, 02:51