2013-07-24 5 views
5

मैं कर्मचारी जानकारी वाले संग्रह से पूछताछ करने का प्रयास कर रहा हूं। जब मैं उस संग्रह क्वेरी मैं जहां प्रत्येक वस्तु दो क्षेत्रों है वस्तुओं का एक गणन वापस जाने के लिए करना चाहते हैं: (! ध्यान दें कि हर प्रबंधक भी एक कर्मचारी है)LINQ एक चयन के भीतर चुनें

  • नाम
  • ManagerName

अब, यहां मेरी समस्या है। जब मैं एक select के भीतर एक select करते हैं, कि प्रत्येक वस्तु पर दिया जाता है ManagerName फ़ील्ड का मान:

System.Data.Common.Internal.Materialization.CompensatingCollection<string> 

क्वेरी है:

var query = 
    from e in db.Employees  
    select new 
    { 
     Name = e.Name, 
     ManagerName = 
      from em2 in db.Employees 
      where (em2.EmployeeID == e.ManagerID) 
      select em2.Name 
    }; 

विशेष रूप से, जब मैं के मूल्य पर गौर ManagerName, मुझे लगता है कि यह एक गणना है जो एक ही वस्तु उत्पन्न करती है। और यह कि एक आइटम एक स्ट्रिंग है जिसमें प्रबंधक का नाम होता है। तो, मुझे लगता है कि मैं करीब हूँ।

प्रश्न: मैं कैसे जहां प्रत्येक वस्तु बस दो स्ट्रिंग क्षेत्रों, Name और ManagerName है ताकि बजाय यह वस्तुओं का एक गणन रिटर्न मेरी क्वेरी को बदल सकते हैं?

+0

क्या परिणाम आप चाहते हैं और आप क्या परिणाम क्या है कोई डब्ल्यू? क्या आपके पास अब 'क्वेरी' चर में तारों की एक संग्रह जोड़ी नहीं है? – FSou1

+0

अब मेरे पास है: obj.Name = "MyName"; obj.ManagerName = System.Data.Common.Internal.Materialization.CompensatingCollection और केवल उस वस्तु यह "MyManagerName" है अंदर मैं चाहता हूँ: obj.Name = "MyName"; obj.ManagerName = "MyManagerName"; –

+1

और आप क्या प्राप्त करना चाहते हैं? – FSou1

उत्तर

11

इस प्रयास करें:

var query = from e in db.Employees 
      select new 
      { 
       Name = e.Name, 
       ManagerName = db.Employees 
           .Where(x => x.EmployeeID == e.ManagerID) 
           .Select(x => x.Name).SingleOrDefault() 
      }; 

हालांकि, अगर आप सही ढंग से EF (जो मैं प्रयोग कर रहे हैं लगता है) के साथ अपने डेटाबेस मैप किया गया है, तो आप एक नेविगेशन संपत्ति होनी चाहिए आप उपयोग कर सकते हैं:

var query = from e in db.Employees 
      select new 
      { 
       Name = e.Name, 
       ManagerName = e.Manager.Name 
      }; 
+0

यह काम करता था लेकिन मुझे FirstOrDefault में बदलना पड़ा या मुझे यह त्रुटि मिल रही थी: {"विधियों 'सिंगल' और 'सिंगलऑर्डडिल्ट' का उपयोग केवल अंतिम क्वेरी ऑपरेशन के रूप में किया जा सकता है। इसके बजाय इस उदाहरण में 'FirstOrDefault' विधि का उपयोग करने पर विचार करें ।}} –

+0

मुझे अभी भी समझ में नहीं आया कि विषय स्टार्टर क्या चाहता है :( – FSou1

+0

@ FSou1: वह बस प्रत्येक चयनित कर्मचारी के लिए प्रबंधक का नाम रखना चाहता है। –

2

एक तरह लग रहा है आत्म में शामिल होने से काम करना चाहिए:

var query = from e in db.Employees 
      join m in db.Employees on e.ManagerID equals m.EmployeeID 
       select new 
       { 
       Name = e.Name, 
       ManagerName = m.Name 
       }; 
+0

मुझे लगता है कि आपको जॉइन स्थिति में '=' के बजाय 'बराबर' का उपयोग करने की आवश्यकता है। –

+0

@DanielHilgarth अच्छा पकड़ - सही। –

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