1

私は2つのテーブルを持っています:

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

playerNameからteamNameを取得したい。2つのクエリを作成しましたが、そのうちの1つは機能しません。

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

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 に答える
1

「kobe」という名前のプレーヤーが 1 人または 0 人いる場合、どちらのクエリでも同じ結果が得られます。「kobe」という名前のプレーヤーが複数いる場合、最初のクエリは何もSingleOrDefault返しません。これは、コレクションに値が 1 つだけ含まれていない場合にデフォルト値を返すサブクエリを使用するためです。2 番目のクエリは、チーム名を返します。各選手の名前は「kobe」。

于 2012-10-22T03:34:38.570 に答える