दिलचस्प पोस्ट
प्रोग्राम बैकस्टैक्स में पिछले खंड पर वापस जाएं अंतिम डाली गई पंक्ति से मान कैसे प्राप्त करें? सी # अगर / फिर डिबग बनाम रिलीज के लिए निर्देश JavaFX 2.1: टूलकिट को आरम्भ नहीं किया गया स्थैतिक चर थ्रेड्स के बीच साझा किए गए हैं? विशिष्ट URL में डेटा को कैसे सी # में WebClient का उपयोग करें मैं एक if / ifish.js में अन्य क्या करूँ? यदि वे स्थिर वर्ग चर को संशोधित नहीं करते हैं, तो क्या गैर-सिंक्रनाइज़ स्थिर विधियां थ्रेड सुरक्षित हैं? चेतावनी `$ HTTP_RAW_POST_DATA` को बहिष्कृत किया जा रहा है सी # स्क्रिप्ट फाइल को कैसे निष्पादित करें। सरणी के साथ दस्तावेज़ खोजें जिसमें एक विशिष्ट मान शामिल है वेबकिट बैफ़ेस दृश्यता काम नहीं कर रहा है एप्पल डेवलपर कार्यक्रम या भागने के बिना उपकरण पर आईओएस एप का परीक्षण करें सूची दृश्य (एंड्रॉइड) के लिए एक ऑनक्लिकलिस्टर जोड़ना सभी चित्रों के साथ एक सरणी कैसे प्राप्त करें?

गतिशील रूप से LINQ क्वेरीज़ उत्पन्न

हमारे पास एक वस्तु है

public class SomeObject { public Name {get;set;} public City {get;set;} public State {get;set} //various other parameters. Let's say there's ~20 } 

स्रोत कोड के पुन: संयोजन के बिना नई LINQ क्वेरी को गतिशील बनाने के लिए क्या संभव है? इसके बजाय, क्वेरी पैरामीटर एक XML संरचना से आते हैं जो डेटाबेस में संग्रहीत और अपडेट किया जाता है।

 var result = from i in someObj where //XML requests Name = 'Bob'...so append this where clause name = 'Bob' 

क्या यह किया जा सकता है?

वेब के समाधान से एकत्रित समाधान "गतिशील रूप से LINQ क्वेरीज़ उत्पन्न"

अभिव्यक्ति के पेड़ के साथ यहां एक समाधान है:

 var param = Expression.Parameter(typeof(SomeObject), "p"); var exp = Expression.Lambda<Func<SomeObject, bool>>( Expression.Equal( Expression.Property(param, "Name"), Expression.Constant("Bob") ), param ); var query = someObj.Where(exp); 

मुझे पता है कि यह बहुत जटिल है, लेकिन यह कई बार उपयोगी हो सकता है।

आप निश्चित रूप से डायनामिक लिंक पर एक नज़र डालना चाहते हैं जो आपको क्वेरी की शर्तों को पाठ के रूप में परिभाषित करने की अनुमति देगा।

गतिशील रूप से स्थितियों को जोड़ने के लिए, आप समान वाक्यविन्यास का उपयोग करने के लिए एक क्वेरी में शर्तों को जोड़ सकते हैं;

 if(CategoryIsImportant) myQuery = myQuery.Where("CategoryId=2"); 

जो सभी आप अपनी पसंद के XML प्रारूप में (काफी आसानी से) सांकेतिक शब्दों में बदल सकते हैं

आपके प्रश्न के आधार पर मुझे बताना मुश्किल है, लेकिन कुछ मामलों में आपको गतिशील लिनक की ज़रूरत नहीं है और यह बस ऐसा कर सकता है …

 var result = from o in someObj where (Name == null || o.Name == Name) && (City == null || o.City == City) && (State == null || o.State == State) select o; 

यह अनिवार्य रूप से डेटा को फ़िल्टर्ड होने से रोक देगा, जब प्रश्न में पैरामीटर शून्य है। और यह अभी भी सी # में शॉर्ट सर्किटिंग व्यवहार के लिए धन्यवाद करता है।

शायद डायनामिक लिंक आपकी मदद कर सकता है: गतिशील linq भाग 1: linq गतिशील क्वेरी लाइब्रेरी का उपयोग करना

 query = query.Where("Id = 123 And Age > 18"); 

या आप सीधे अपनी लिनक क्वेरी को हेरफेर कर सकते हैं:

 query = query.Where(x=>x.Id == 5); 

मेरा मानना ​​है कि आपको वास्तव में अभिव्यक्ति पेड़ों में खिसकना होगा मैंने इस पर बहुत दूर खोदा नहीं किया है, इसलिए मैं आपके लिए एक नमूना नहीं बना सकता, लेकिन मुझे पता है कि आप अपने प्रश्नों को गतिशील बनाने और फिर कॉल करने के लिए अभिव्यक्ति पेड़ का उपयोग कर सकते हैं .कंपली (कोड में) इसे चलाने योग्य

दरअसल, अभिव्यक्ति पेड़ के साथ बिल्डिंग डायनामिक क्वेरी बेहतर लिंक है। यह आपको बिल्कुल वही देनी चाहिए जो आप चाहते हैं, और यह क्या है के लिए काफी संक्षिप्त है। यह आपके लिए एक अच्छा उदाहरण के रूप में कार्य करना चाहिए 🙂

मुझे लगता है कि आप अपने XML की सामग्री के आधार पर, वैकल्पिक फ़िल्टर शुरू करना चाहते हैं। स्ट्रिपलिंगवायरर द्वारा उदाहरण पर जारी रखने के लिए:

 var name = GetNameFromXml(); var city = GetCityFromXml(); var state = GetStateFromXml(); var result = someObj; if (name != null) result = result.Where(i => i.Name == name); if (city != null) result = result.Where(i => i.City == city); if (state != null) result = result.Where(i => i.State == state); 

इस तरह, आप अपने XML में वास्तव में निर्दिष्ट किए गए के आधार पर, किसी भी संख्या में फिल्टर (कोई भी तीन से नहीं) लागू करेंगे।

हां, यह वास्तव में बहुत आसान है:

 var name = GetBobNameFromXml(); var result = someObj.Where(i => i.Name == name); 

आप यह भी चुन सकते हैं कि मापदंड के टुकड़े टुकड़े को लागू करने के लिए या नहीं।

 var result = someObj; var name = xmlCriteria.Name; if(!string.IsNullOrEmpty(name)) { result = result.Where(i => i.Name == name); } // follow the same pattern for city, state, etc. 

आप यहां तक ​​कि एक पैटर्न का उपयोग कर सकते हैं, जो कथित तौर पर मानदंडों के नाम के शब्दकोश का उपयोग करता है, if कथनों के बंटवारे से बचने के लिए।

 foreach(var criterionPair in xmlCriteria) { var value = criterionPair.Value; result = result.Where(i => propGetters[criterionPair.PropertyName](i, value)); } 

असल में, आप इन पंक्तियों के साथ बहुत कुछ कर सकते हैं यदि आप अपनी स्थिति के अनुसार विशेष रूप से एक जवाब चाहते हैं, तो आपको एक अधिक विशिष्ट प्रश्न प्रदान करने की आवश्यकता होगी।