这样的Linq查询有什么问题

时间:2012-10-22 03:03:57

标签: c# linq

我有两张桌子:

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

任何人都可以告诉我为什么第一个查询无效?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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