我有两张桌子:
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
任何人都可以告诉我为什么第一个查询无效?
答案 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