2008-11-12 21 views
10
  • मैं LINQ क्वेरी के SELECT खंड में एक?: ऑपरेटर का उपयोग कैसे करूं? यदि यह नहीं किया जा सकता है, तो मैं एक का अनुकरण कैसे कर सकता हूं? लक्ष्य मेरे चयन खंड में एक CASE ब्लॉक प्राप्त करना है। जैसा कि आपको संदेह हो सकता है, मुझे एक त्रुटि मिल रही है: अमान्य अनाम प्रकार सदस्य घोषणाकर्ता। बेनामी प्रकार के सदस्यों को सदस्य असाइनमेंट, सरल नाम या सदस्य पहुंच के साथ घोषित किया जाना चाहिए।?: LINQ क्वेरी में ऑपरेटर

  • इस "एक आंतरिक से मैं में शामिल होने a.ipid = i.id भीतरी पर यू i.uid = u.id पर शामिल होने के" उचित तरीके से, या एक पर्याप्त तरह से, कहने के लिए है? यदि नहीं, तो कृपया एक प्रदान करें। धन्यवाद।

    var query = 
        from a in db.tblActivities 
        from i in db.tblIPs 
        from u in db.tblUsers 
        select new { 
         u.UserName == null 
          ? i.Address 
          : u.UserName, 
         a.Request, 
         a.DateTime }; 
    

उत्तर

18

एक अनाम प्रकार बनाते समय (आप एक प्रकार निर्दिष्ट किए बिना "नया" के साथ क्या कर रहे हैं) आपको प्रत्येक संपत्ति के लिए सदस्य का नाम निर्दिष्ट करना होगा। अपने उदाहरण से, यह कुछ इस तरह दिखेगा: (यह भी तय आपके मिलती है)

var query = from a in db.tblActivities 
      join i in db.tblIPs on a.ipid equals i.id 
      join u in db.tblUsers on i.uid equals u.id 
      select new { 
       UserName = (u.UserName ?? i.Address), 
       Request = a.Request, 
       Date = a.DateTime 
      }; 

आप शायद उपयोगकर्ता नाम अपना रास्ता कर सकता है, भी:

UserName = (u.UserName == null) ? i.Address : u.UserName, 

लेकिन ?? ऑपरेटर अधिक संक्षिप्त है। यह एसक्यूएल में "isnull" के समान है।

+0

बहुत बढ़िया।यही कारण है कि बहुत करीब था, और जवाब देने के लिए मुझे मिल गया: TblActivities में एक से TblUsers में यू में शामिल होने a.IPID i.ID के बराबर होती है पर TblIPs में मैं शामिल होने के a.UID के बराबर होती है पर u.ID नए {उपयोगकर्ता नाम = का चयन करें (u.UserName ?? i.Address), Request = a.Request, date = a.DateTime} – tsilb

+0

यदि आप मेरा उदाहरण देखते हैं तो आप तालिका उपनामों का उपयोग करके शामिल कथन को छोड़ सकते हैं। – LeppyR64

+0

जुड़ने के बिना, आपने अभी कार्टेशियन जॉइन (क्रॉस उत्पाद) लागू किया है। यदि प्रत्येक तालिका में 10 पंक्तियां थीं, तो आपको 1000 परिणाम वापस मिलेंगे। मेरा विश्वास करो, आप वास्तव में चाहते हैं कि वे वहां हों। – GalacticCowboy

0

मैं एसक्यूएल को Linq करने के लिए काफी नई कर रहा हूँ, लेकिन मैं बहुत यकीन है कि यह इस तरह जाना होगा हूँ:

var query = 
    from a in db.tblActivities 
    from i in a.tblIPs 
    from u in i.tblUsers 
    select new 
    { 
     userName = (u.UserName == null) 
      ? i.Address 
      : u.UserName, 
     a.Request, 
     a.DateTime 
    }; 

अगर बयान कोष्ठक में हो सकता है और बाहर परिणामों की जरूरत है उनमें से। जुड़ने के लिए, आप चेन का पालन करें-> कई से।

1

आपको शामिल कीवर्ड का उपयोग करना होगा, और उचित आंतरिक जुड़ने के लिए संस्थाओं के बीच संबंधों को परिभाषित करना होगा।

Here आप इसके बारे में कुछ उदाहरण पा सकते हैं, मैं आपको LinqPad प्राप्त करने की अत्यधिक अनुशंसा करता हूं, यह आपके प्रश्नों का परीक्षण करने के लिए एक बहुत ही मूल्यवान टूल है, यह सीखने के लिए भी बहुत अच्छा है, इसमें 200+ उदाहरण हैं।

+0

धन्यवाद ... +1, लिंककैड के बारे में कभी नहीं सुना, बहुत आसान; धन्यवाद! – tsilb

0

यदि आप केवल शून्य के लिए जांच रहे हैं, तो आप भी इसका उपयोग कर सकते हैं ??

string something = null; 
string somethingElse = something ?? "default value"; 

उपरोक्त उदाहरण के लिए, यह जो कि जाना करने के लिए सही है ...

string something = (somethingElse == null ? "If it is true" : "if it is false"); 

कोष्ठक की आवश्यकता नहीं है, लेकिन वे पढ़ने में सहायता करते हैं।

+0

आपका तर्क मानक स्ट्रिंग मैनिप्ल्यूशन के लिए अच्छा है, लेकिन यह LINQ केवल आधा रास्ते जिस तरह से एक सहजता से अपेक्षा करता है ... वही त्रुटि। – tsilb

+0

अजीब ... मैंने इसे LINQ प्रश्नों में पहले उपयोग किया है ... दूसरा भाग जो है। – Hugoware

0

वास्तव में। यह प्रश्न IQueryable के विशेष कार्यान्वयन पर निर्भर करता है कि आपकी linq अभिव्यक्ति वापस आ जाएगी। मैं देखता हूं कि आपके पास db.XXX है, तो क्या आप linq का उपयोग एसक्यूएल या कुछ लिनक डेटा स्टोर में कर रहे हैं? यदि ऐसा है, तो IQueryable के विशिष्ट कार्यान्वयन को आपकी अभिव्यक्ति को स्टोर अभिव्यक्ति में अनुवाद करने का एक तरीका होना चाहिए। उपरोक्त टिप्पणियों के अलावा, कुछ अन्य टिप्पणियां सही हैं कि अज्ञात प्रकार में आपको प्रत्येक सदस्य के लिए एक नाम निर्दिष्ट करना होगा। यह वास्तव में आपकी त्रुटि है।

+0

डीबी मेरे लिंक से SQL कक्षा के लिए DataContext है। – tsilb

+0

मैं देखता हूं, यह समझ में आता है। क्या आपके पास इन सभी के बीच उत्तर देने की आवश्यकता है? – user36784