1

我有两张桌子:

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

我想通过 playerName 获取 teamName。我写了两个查询,其中一个不起作用。

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

谁能告诉我为什么第一个查询不起作用?

4

2 回答 2

1

如果有一个或零个名为“kobe”的玩家,则两个查询都应该产生相同的结果。如果有多个名为“kobe”的球员,第一个查询将不会返回任何内容,因为它的子查询使用SingleOrDefault,如果集合不包含恰好一个值,则返回默认值,而第二个查询将返回 teamName每个球员都叫“科比”。

于 2012-10-22T03:34:38.570 回答
1

Risky Martin 已经提到了原因,但除此之外,您还可以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
于 2012-10-22T03:49:03.000 回答