c# - LINQ से एसक्यूएल जहां क्लॉज वैकल्पिक मानदंड





asp.net linq-to-sql (4)


आप अपनी मूल क्वेरी को कोड कर सकते हैं:

var query = from tags in db.TagsHeaders
                where tags.CST.Equals(this.SelectedCust.CustCode.ToUpper()) 
                && Utility.GetDate(DateTime.Parse(this.txtOrderDateFrom.Text)) <= tags.ORDDTE
                && Utility.GetDate(DateTime.Parse(this.txtOrderDateTo.Text)) >= tags.ORDDTE
                select tags;

और फिर एक शर्त के आधार पर, अतिरिक्त बाधाओं को जोड़ें।

if(condition)
    query = query.Where(i => i.PONumber == "ABC"); 

मुझे यकीन नहीं है कि क्वेरी सिंटैक्स के साथ इसे कैसे कोड करें लेकिन आईडी लैम्ब्डा के साथ काम करती है। प्रारंभिक क्वेरी के लिए क्वेरी सिंटैक्स और द्वितीयक फ़िल्टर के लिए लैम्ब्डा के साथ भी काम करता है।

आप एक विस्तार विधि (नीचे) भी शामिल कर सकते हैं जिसे मैंने सशर्त कहां शामिल करने के लिए थोड़ी देर पहले कोड किया था। (क्वेरी वाक्यविन्यास के साथ अच्छी तरह से काम नहीं करता है):

        var query = db.TagsHeaders
            .Where(tags => tags.CST.Equals(this.SelectedCust.CustCode.ToUpper()))
            .Where(tags => Utility.GetDate(DateTime.Parse(this.txtOrderDateFrom.Text)) <= tags.ORDDTE)
            .Where(tags => Utility.GetDate(DateTime.Parse(this.txtOrderDateTo.Text)) >= tags.ORDDTE)
            .WhereIf(condition1, tags => tags.PONumber == "ABC")
            .WhereIf(condition2, tags => tags.XYZ > 123);

विस्तार विधि:

public static IQueryable<TSource> WhereIf<TSource>(
    this IQueryable<TSource> source, bool condition,
    Expression<Func<TSource, bool>> predicate)
{
    if (condition)
        return source.Where(predicate);
    else
        return source;
}

IENumerables के लिए एक ही एक्सटेंशन विधि यहां दी गई है:

public static IEnumerable<TSource> WhereIf<TSource>(
    this IEnumerable<TSource> source, bool condition,
    Func<TSource, bool> predicate)
{
    if (condition)
        return source.Where(predicate);
    else
        return source;
}

मैं LINQ से SQL क्वेरी के साथ काम कर रहा हूं और डेटा समस्या को फ़िल्टर करने के लिए मेरे पास 4 वैकल्पिक फ़ील्ड हैं जहां एक समस्या है। वैकल्पिक रूप से, मेरा मतलब है कि कोई मान दर्ज करना है या नहीं। विशेष रूप से, कुछ टेक्स्ट बॉक्स जिनमें कोई मान हो सकता है या एक खाली स्ट्रिंग हो सकती है और कुछ ड्रॉप डाउन सूचियां हो सकती हैं जिनके पास मूल्य चुना गया हो या शायद नहीं ...

उदाहरण के लिए:

    using (TagsModelDataContext db = new TagsModelDataContext())
     {
        var query = from tags in db.TagsHeaders
                    where tags.CST.Equals(this.SelectedCust.CustCode.ToUpper()) 
                    && Utility.GetDate(DateTime.Parse(this.txtOrderDateFrom.Text)) <= tags.ORDDTE
                    && Utility.GetDate(DateTime.Parse(this.txtOrderDateTo.Text)) >= tags.ORDDTE
                    select tags;
        this.Results = query.ToADOTable(rec => new object[] { query });
    }

अब मुझे निम्नलिखित फ़ील्ड / फ़िल्टर जोड़ने की जरूरत है, लेकिन केवल तभी जब वे उपयोगकर्ता द्वारा आपूर्ति की जाती हैं।

  1. उत्पाद संख्या - एक और तालिका से आता है जिसे टैगहेडर में शामिल किया जा सकता है।
  2. पीओ संख्या - टैगहेडर तालिका के भीतर एक फ़ील्ड।
  3. आदेश संख्या - पीओ # के समान, बस अलग कॉलम।
  4. उत्पाद स्थिति - यदि उपयोगकर्ता ने इसे ड्रॉप डाउन से चुना है, तो यहां चयनित मान लागू करने की आवश्यकता है।

मेरे पास पहले से मौजूद प्रश्न बहुत अच्छा काम कर रहा है, लेकिन फ़ंक्शन को पूरा करने के लिए, जहां इन खंडों में इन 4 अन्य आइटमों को जोड़ने में सक्षम होना चाहिए, बस यह नहीं पता कि कैसे!







पैरामीटर के अस्तित्व के लिए बस एक सशर्त जांच का उपयोग करने की आवश्यकता है। उदाहरण के लिए:

where (string.IsNullOrEmpty(ProductNumber) || ProductNumber == tags.productNumber)

इस तरह यदि उत्पाद संख्या दर्ज नहीं की गई है तो अभिव्यक्ति सभी मामलों में सच हो जाएगी, लेकिन यदि यह दर्ज किया गया है तो यह मेल खाने पर ही सही होगा।




मुझे समझ में नहीं आता कि आप FirstOrDefault(x=> x.ID == key) का उपयोग क्यों कर रहे हैं, जब आप Find(key) उपयोग करते हैं तो यह परिणाम अधिक तेज़ी से प्राप्त कर सकता है। यदि आप तालिका की प्राथमिक कुंजी से पूछताछ कर रहे हैं, तो अंगूठे का नियम हमेशा Find(key) उपयोग करना है। FirstOrDefault का उपयोग (x=> x.Username == username) सामान जैसे (x=> x.Username == username) आदि के लिए किया जाना चाहिए।

यह एक डाउनवोट के लायक नहीं था क्योंकि प्रश्न का शीर्षक डीबी या लिंक से सूची / आईनेमरेबल इत्यादि पर लिनक के लिए विशिष्ट नहीं था।





c# asp.net linq linq-to-sql