2009-09-02 17 views
29

मैं बहुत की तरह एक प्रश्न करने के लिए कोशिश कर रहा हूँ ...LINQ वाक्यविन्यास जहां स्ट्रिंग मान शून्य या रिक्त नहीं है

query.Where(x => !string.IsNullOrEmpty(x.PropertyName)); 

लेकिन यह विफल रहता है ...

अब के लिए इतना

मैं लागू कर दिया है निम्नलिखित, जो काम करता है ...

query.Where(x => (x.PropertyName ?? string.Empty) != string.Empty); 

क्या एक बेहतर (अधिक देशी?) तरीका है कि LINQ इसे संभालता है?

संपादित

माफी माँगता हूँ! प्रदाता शामिल नहीं किया गया ... यह LINQ से SQL

+0

क्या LINQ प्रदाता? एसक्यूएल, इकाई, वस्तु, ...? –

+0

मुझे लगता है कि आपका LINQ प्रदाता String.IsNullOrEmpty() को NotSupportedException का समर्थन नहीं करता है। –

+0

क्या आप समझा सकते हैं कि यह क्यों विफल रहता है? इसके माध्यम से क्या मूल्य प्राप्त हो रहे हैं कि आप इसे बनाने की उम्मीद नहीं करते हैं। मैं इस विशेष कोड के साथ कुछ भी गलत नहीं देख सकता (या दूसरे उदाहरण से इसे अलग कैसे करेगा)। – JaredPar

उत्तर

37

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=367077

समस्या वक्तव्य
यह एसक्यूएल कि सभी पंक्तियों है कि या तो नल या किसी दिए गए क्षेत्र में एक खाली स्ट्रिंग हो जाता है करने के लिए LINQ लिखने के लिए संभव है, लेकिन यह करने के लिए string.IsNullOrEmpty उपयोग करने के लिए संभव नहीं है यह, भले ही कई अन्य स्ट्रिंग विधियां LINQ से SQL पर मैप करें। प्रस्तावित समाधान एसक्यूएल करने के लिए एक LINQ में string.IsNullOrEmpty अनुमति दें जहां खंड इसलिए इन दो प्रश्नों ही परिणाम है कि:

var fieldNullOrEmpty = 
from item in db.SomeTable 
where item.SomeField == null || item.SomeField.Equals(string.Empty) 
select item; 

var fieldNullOrEmpty2 = 
from item in db.SomeTable 
where string.IsNullOrEmpty(item.SomeField) 
select item; 

अन्य पढ़ना:
1. DevArt
2. Dervalp.com
3।StackOverflow Post

2

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

समस्या यह है कि डीबी प्रदाता तार के सभी ऑब्जेक्ट को खींचने से रोकने के लिए LINQ क्वेरी को डेटाबेस क्वेरी के रूप में स्थानांतरित और संकलित करने का प्रयास करते हैं। यह एक अच्छी बात है, लेकिन कभी-कभी आपके भविष्यवाणियों में लचीलापन प्रतिबंधित करती है।

दुर्भाग्यवश, प्रदाता प्रलेखन की जांच किए बिना, हमेशा यह जानना मुश्किल है कि प्रदाता में सीधे क्या समर्थन किया जाएगा या नहीं। ऐसा लगता है कि आपका प्रदाता तुलना की अनुमति देता है, लेकिन स्ट्रिंग चेक नहीं। मुझे लगता है कि, आपके मामले में, यह शायद एक दृष्टिकोण के रूप में अच्छा है जैसा आप प्राप्त कर सकते हैं। (यह सचमुच नहीं है कि तुलना के लिए "string.Empty" उदाहरण बनाने के अलावा, लेकिन यह मामूली है।)

14

यह लिंक 2 ऑब्जेक्ट्स पर असफल नहीं होगा, लेकिन यह Linq2SQL के लिए विफल हो जाएगा, इसलिए मैं मुझे लगता है कि आप एसक्यूएल प्रदाता या कुछ इसी तरह के बारे में बात कर रहे हैं।

कारण यह है कि SQL प्रदाता आपके लैम्ब्डा अभिव्यक्ति को संभालता है। यह इसे Func<P,T> फ़ंक्शन के रूप में नहीं लेता है, लेकिन एक अभिव्यक्ति Expression<Func<P,T>> है। यह अभिव्यक्ति वृक्ष लेता है और इसे वास्तविक SQL कथन का अनुवाद करता है, जो इसे सर्वर पर भेजता है।

अनुवादक जानता है कि बुनियादी ऑपरेटरों को कैसे संभालना है, लेकिन यह नहीं जानता कि वस्तुओं पर विधियों को कैसे संभालना है। यह नहीं जानता कि IsNullOrEmpty(x)return x == null || x == string.empty पर अनुवाद करता है। इसे एसक्यूएल के अनुवाद के लिए स्पष्ट रूप से किया जाना है।

+1

ग्रेट स्पष्टीकरण की आवश्यकता है - धन्यवाद! –

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