2013-07-24 139 views
5

我想查詢包含僱員信息的集合。當我詢問該集合,我想返回對象的枚舉,每個對象有兩個字段:(!需要注意的是每一個經理也是一個Employee)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,我看到它是一個產生單個項目的枚舉。並且該單個項目是一個包含Manager名稱的字符串。所以,我覺得我很接近。

問:我怎樣才能改變我的查詢,以便而是返回對象的枚舉,其中每個對象只是有兩個字符串字段,NameManagerName

+0

你想要什麼結果,你有什麼結果沒有W'你現在不在'query'變量中有一組字符串集合嗎? – 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或我得到這個錯誤: {「方法'Single'和'SingleOrDefault'只能用作最後的查詢操作。在這個例子中考慮使用方法'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

我認爲你需要在連接條件中使用'equals'而不是'='。 –

+0

@DanielHilgarth良好的捕獲 - 糾正。 –