2012-04-16 15 views
8

इस तरह के कुछ अन्य प्रश्न हैं, लेकिन उनमें से कोई भी ऐसा करने की प्रतीत नहीं कर रहा है जो मैं करने की कोशिश कर रहा हूं। मैं स्ट्रिंग और क्वेरीLINQ स्वाद आईएस इन क्वेरी

SELECT ownerid where sysid in ('', '', '') -- i.e. List<string> 

या

var chiLst = new List<string>(); 
var parRec = Lnq.attlnks.Where(a => a.sysid IN chiList).Select(a => a.ownerid); 

मैं चारों ओर a.sysid.Contains के साथ खेल किया गया है(), लेकिन जैसे की एक सूची में पास करना चाहते हैं पाने के लिए नहीं कर पाए हैं कहीं भी।

var chiLst = new List<string>(); 
var parRec = Lnq.attlnks.Where(a => chiList.Contains(a.sysid)) 
         .Select(a => a.ownerid); 

यद्यपि आप दिए गए एक सूची के बजाय एक HashSet<string>, प्रदर्शन के मामले में साथ बेहतर होगा, सभी चेक शामिल हैं:

+1

+1 यदि आपको लगता है कि जॉन स्कीट बैज लॉल –

उत्तर

11

Contains आगे रास्ता है। कि प्रदर्शन पहलू यह सोचते है (यही कारण है कि वहाँ काफी कुछ प्रविष्टियों ... मूल्यों की एक छोटी संख्या के लिए किया जाएगा संभालने है, यह बहुत अंतर किसी भी तरह से कर देगा नहीं है, और एक List<string> भी तेजी से हो सकता है।)

नोट आप इसके लिए LINQ से ऑब्जेक्ट्स का उपयोग कर रहे हैं - यदि आप LINQ से SQL जैसे कुछ का उपयोग कर रहे हैं, तो इससे कोई फर्क नहीं पड़ता कि Contains किसी भी तरह से प्रक्रिया में नहीं किया जाएगा।

+0

+1 द्वारा आपके प्रश्न का पहला उत्तर होना चाहिए। एक मिनट में 5 वोट, बधाई :) – mellamokb

+3

लिंक से एसक्यूएल जैसे कुछ के लिए, हैशसेट कोई फर्क नहीं पड़ता है, क्योंकि यह सूची के सभी तत्वों को लेता है और इन खंड उत्पन्न करता है। – RobSiklos

+0

@ जोन स्कीट हैशसेट जॉन का उपयोग करके क्या अंतर है? –

1

आप a.sysid.Contains पर कॉल नहीं करेंगे; IN (SQL) के लिए वाक्य रचना

var parRec = Lnq.attlnks.Where(a => chiList.Contains(a.sysid)) 
         .Select(a => a.ownerid); 
1

Contains (LINQ) के लिए वाक्य रचना के पीछे Contains दृष्टिकोण के अलावा join, आप कर सकते थे है:

var parRec = from a in Lnq.attlnks 
      join sysid in chiLst 
       on a.sysid equals sysid 
      select a.ownerid 

मैं इस लिए कि क्या यकीन नहीं है हैशसेट के साथ Contains से बेहतर प्रदर्शन करेगा, लेकिन कम से कम समान प्रदर्शन होगा। यह सूची के साथ Contains का उपयोग करने से निश्चित रूप से बेहतर होगा।

+0

ऑब्जेक्ट्स को LINQ मानते हुए, यह मूल रूप से कार्यान्वयन के भीतर 'हैशसेट ' का निर्माण करेगा। (और यह सूची 'सूची '* से अधिक होगी यदि सूची बड़ी हो जाती है * - यदि सूची बहुत छोटी है, तो हैश-आधारित कार्यान्वयन धीमा हो सकता है, क्योंकि इसे पहले लक्ष्य के हैश उत्पन्न करने की आवश्यकता है। वास्तव में खेल में सभी प्रकार के चर हैं।) –