C# 什么';这样的Linq查询有什么不对

C# 什么';这样的Linq查询有什么不对,c#,linq,C#,Linq,我有两张桌子: Team: teamId, teamName Player: playerId, teamId, playerName 我想通过playerName获得球队名称。我写了两个查询,其中一个不起作用 var query = from t in dc.Teams where t.teamId == ((from p in dc.Players where p.playerName == "ko

我有两张桌子:

Team: teamId, teamName
Player: playerId, teamId, playerName
我想通过playerName获得球队名称。我写了两个查询,其中一个不起作用

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

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

如果有一个或零个名为“kobe”的玩家,两个查询应该产生相同的结果。如果有多个名为“kobe”的玩家,第一个查询将不会返回任何内容,因为其子查询使用
SingleOrDefault
,如果集合不包含一个值,则返回默认值,而第二个查询将返回名为“kobe”的每个玩家的球队名称.马丁已经提到了原因,但除此之外, 您可以使用
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

您现在应该已经知道如何缩进代码…错误消息?似乎您正在尝试在调用SingleOrDefault()后进行投影(选择)。这是没有道理的。你有没有收到一个错误,或者它只是没有返回你所期望的?