मेरे पास मूल रूप से एक वेबएपीआई सेवा है जो क्लाइंट को मूल्य लौटा रही है।

मेरे पास documents अनुरोधों को संभालने के लिए एक नियंत्रक है, जिसे एक साधारण enum द्वारा पैरामीटरीकृत प्रदान किया जा सकता है।

यह सरल एनम इस तरह के विकल्प दे रहा है:

public enum DataRange
{
    Last7Days,
    Last30Days,
    Last90Days,
    ThisYear,
    Last10,
    Last50,
    Last100,
    Last500,
    All
}

मैं वास्तव में डीबीसीएन्टेक्स्ट द्वारा क्वेरी को संसाधित करने से पहले "फ्लाई पर" लिंकक्यू क्वेरी को संशोधित करना चाहता हूं, मुझे एक दर्दनाक switch बनाने से परहेज करता है जो कोड को डुप्लिकेट करता है और यह पढ़ने में आसान नहीं है, यहां तक ​​​​कि सुरुचिपूर्ण भी नहीं है।

मैंने वास्तव में दो अलग-अलग तरीकों को बनाने में समस्या को "हैंडल" किया है, यह निर्भर करता है कि यह एक Take(x) शामिल है या एक DateTime .Where() फ़िल्टर है, जो मुझे थोड़ा परेशान करता है।

इस पद्धति में मैं इसके आधार पर lambda लौटाता हूं, जिसमें एक .Take(x) क्वेरी शामिल है:

private IQueryable<Documents> GetQueryByRegistries(DataRange dataRange)
{    
    switch (dataRange)
    {
        case DataRange.Last10:
            return Context.Documents
                              .Where(x => x.Auditoria)
                              .Include(x => x.Variables)
                              .Include(x => x.Events)
                              .OrderBy(x => x.Creation)
                              .Take(10);

        case DataRange.Last50:
            return Context.Documents
                              .Where(x => x.Auditoria)
                              .Include(x => x.Variables)
                              .Include(x => x.Events)
                              .OrderBy(x => x.Creation)
                              .Take(50);
                ...
        case DataRange.All:
            return Context.Documents
                              .Where(x.Auditoria)
                              .Include(x => x.Variables)
                              .Include(x => x.Events)
                              .OrderBy(x => x.Creation);

        default:
            return Context.Documents
                              .Where(x => x.Auditoria)
                            .Include(x => x.Variables)
                            .Include(x => x.Events)
                            .OrderBy(x => x.Creation);
    }
}


private IOrderedQueryable<Documents> GetQueryByDays(DataRange dataRange)
{
    var limitDateTime = DataRange.GetClause(dataRange);
    var documents = Context.Documents
                              .Where(x => x.Auditoria
                                  && x.Creation >= limitDateTime)
                                     .Include(x => x.Variables)
                                     .Include(x => x.Events)
                                     .OrderBy(x => x.Creation);
    return documents;
}

यहां मैं where क्लॉज के लिए डेटटाइम बनाने का काम संभालता हूं:

public static DateTime GetClause(DataRange dateTimeRange)
{
    switch (dateTimeRange)
    {
        case DataRange.Last7Days:
            return Last7Days();
        case DataRange.Last30Days:
            return Last30Days();
        case DataRange.Last90Days:
            return Last90Days();
        case DataRange.EsteAno:
            return ThisYear();
        default:
            return BigBang();
    }
}

चूंकि मैं हमेशा स्विच का उपयोग करने से बचने परिदृश्यों की कोशिश कर रहा हूं, इसलिए मैं query को संशोधित करना चाहूंगा मक्खी, इन दो बड़े और बदसूरत switch को बनाने से बचते हुए और मुझे कोड को डुप्लिकेट करने के लिए मजबूर करते हुए, क्वेरी को पैरामीट्रिज करने से रोक रहा है।

मैंने LinqKit की कोशिश की है, लेकिन मैं ईमानदारी से नहीं जानता कि कैसे इसमें मेरी जरूरतों को लागू करें।

अग्रिम धन्यवाद और आशा है कि उदाहरण मदद करते हैं।

0
Gonzo345 11 अक्टूबर 2018, 09:40

1 उत्तर

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

मैं समझता हूं कि आप अपने एनम के आधार पर क्वेरी को बदलना चाहते हैं। मुझे लगता है कि आप यही चाहते हैं।

private IQueryable<Documents> GetQueryByRegistries(DataRange dataRange)
{    
  // this is your base query. which will be common for all conditions.
  var query = Context.Documents
                          .Where(x => x.Auditoria)
                          .Include(x => x.Variables)
                          .Include(x => x.Events);

 switch (dataRange)
 {
    case DataRange.Last10:
        return query.Where(x => x.SomeId == 10).OrderBy(x => x.Creation)
                          .Take(10); // if you want to add Where again you can do that

    case DataRange.Last50:
        return query.OrderBy(x => x.Creation)
                          .Take(50);
            ...
    case DataRange.All:
        return query.OrderBy(x => x.Creation);

    default:
        return query.OrderBy(x => x.Creation);
  }
}
1
Jawand Singh 11 अक्टूबर 2018, 06:49