2012-10-22 42 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