2013-07-24 28 views
5

Çalışan bilgileri içeren bir koleksiyonu sorgulamaya çalışıyorum. Ben bu koleksiyonu sorguladığınızda her nesnenin iki alan vardır nerede nesnelerin bir numaralandırma dönmek istiyorum: (! Her Manager ayrıca bir Çalışan olduğunu unutmayın)LINQ Select içinden bir Seç

  • Adı

  • yönetici ismi

    Şimdi, işte yaşadığınız sorun. Bir select içinde select yaptığınızda, her nesnede döndürülür ManagerName alanın değeri: İşte

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

    sorgu var: Özellikle

    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 
        }; 
    

    , ben değeri baktığınızda ManagerName, bunun tek bir öğe veren bir numaralandırma olduğunu görüyorum. Ve tek öğe, Yöneticinin adını içeren bir dizedir. Yani, yakın olduğumu düşünüyorum.

    Soru: Her basitçe iki dize alanları, Name ve ManagerName sahiptir nesne nerede nasıl bunun yerine nesnelerin bir sayımını döndürmesini sağlayacak şekilde benim sorgu değiştirebilirim?

  • +0

    Ne sonuç istiyorsunuz ve sonuçlarınız nedir? w? Artık 'query' değişkeninde bir dizi koleksiyon diziniz yok mu? – FSou1

    +0

    Şimdi sahibim: obj.Name = "MyName"; obj.ManagerName = System.Data.Common.Internal.Materialization.CompensatingCollection ve istediğim sadece "MyManagerName" sahip olduğunu nesnesinin içinde: obj.Name = "myname"; obj.ManagerName = "MyManagerName"; –

    +1

    Ve ne almak istiyorsun? – FSou1

    cevap

    11

    bu deneyin:

    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() 
          }; 
    

    Ancak, doğru (I kullandığınız varsayalım) EF ile veritabanı eşlenen eğer, bir navigasyon özelliği olmalıdır sen yararlanabilirler:

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

    Çalıştı ancak FirstOrDefault olarak değiştirmem gerekiyordu ya da şu hatayı alıyordum: {"Yöntemler 'Single' ve 'SingleOrDefault' yalnızca bir son sorgu işlemi olarak kullanılabilir.O yerine bu örnekte 'FirstOrDefault' yöntemini kullanmayı düşünün "} –

    +0

    Hala konu başlatıcısının ne istediğini anlamadım :( – FSou1

    +0

    @ FSou1: Sadece seçilen her çalışan için yöneticinin ismine sahip olmak istiyor. –

    2

    Kendine ait bir katılımcının çalışması gerekir:

    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

    Birleştirme durumunda '=' yerine 'equals 'kullanmanız gerektiğini düşünüyorum. –

    +0

    @DanielHilgarth İyi yakalama - düzeltildi. –