2012-10-22 40 views
1

我有兩個表:有什麼不對這種LINQ查詢

Team: teamId, teamName 
Player: playerId, teamId, playerName 

我想通過playerName的teamName。我寫了兩個querys,其中一個不起作用。

var query = from t in dc.Teams 
      where t.teamId == ((from p in dc.Players 
           where p.playerName == "kobe" 
           select p.teamId).SingleOrDefault()) 
      select t.teamName; //Doesn't work 

var query = from t in dc.Teams 
      join p in dc.Players 
       on t.teamId equals p.teamId 
      where p.playerName == "kobe" 
      select t.teamName; //Works 

任何人都可以告訴我爲什麼第一個查詢無法工作?

+2

您應該已經知道現在如何縮進代碼... – gdoron

+1

錯誤消息?看起來你正在嘗試在SingleOrDefault()的調用之後進行投影(select)。這是沒有意義的。 – Marcote

+1

您是否遇到錯誤,或者它只是沒有返回您期望的內容? –

回答

1

如果有一個或零個名爲「kobe」的球員,兩個查詢都應該產生相同的結果。如果有多個名爲「kobe」的玩家,則第一個查詢將不會返回任何內容,因爲其子查詢使用SingleOrDefault,如果集合不包含一個值,則返回默認值,而第二個查詢將返回teamName爲每個名爲「科比」的球員。

1

馬丁馬丁已經提到原因,但除此之外, 您可以使用FirstOrDefault而不是SingleOrDefault。通過使用FirstOrDefault,您的查詢可以返回任意數量的結果,但您聲明只需要第一個結果。

var query = from t in dc.Teams 
      where t.teamId == ((from p in dc.Players 
           where p.playerName == "kobe" 
           select p.teamId).FirstOrDefault()) 
      select t.teamName; //Now it works