1

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

チーム:

ID          Name
------      ---------
1           Giants
2           Yankees
3           Cool Guys

プレイヤー:

ID          Name         Team      IQ        SomeOtherDetail
------      ---------    -------   ------    ----------------
1           Bob          1         100       Oklahoma
2           Joe          1         80        Who knows?
3           Sue          2         130       Who cares?
4           Fred         2         76        42
5           Ed           2         90        Yes, please.
6           Schultz      3         314       :-)

私のコードには流れるクラスが含まれています:

public class Team
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Player> Players { get; set; }
}

古き良き文字列クエリとDataReaderを使用して、プレーヤーを含むすべてのチームのリストを取得しようとしています。

単一のクエリでこれを行う方法はありますか?

この質問の解決策はかなり近づいています。
プレイヤーのリストを1つの文字列として取得して分割することを検討していましたが、すべてのプレイヤーの詳細(名前、IDなど)が必要であるため、役に立たず、しかも汚いトリックのように感じます。

私が考えたもう1つのことは、次のようにクエリを実行することです。

select *
from TEAMS join PLAYERS
on TEAMS.ID = PLAYERS.Team

...(したがって、余分な行を取得します)、linqを使用して結果を集中しますが、これがどれほど効率的かはわかりません。

それで、何か明るいアイデアはありますか?

4

2 に答える 2

3
select t.ID as TeamID, t.Name as TeamName, p.ID as PlayerID, p.Name as PlayerName
     , p.Team as TeamName, p.IQ, p.SomeOtherDetail
from Team t
inner join Players p on t.ID = p.Team

それはあなたに基本的なSQLを与えるでしょう。次に、結果をループして、チームがリストにすでに存在するかどうかを確認し、存在しない場合は追加してから、プレーヤーをプレーヤーのリストに追加する必要があります。

それはあなたの質問に答えますか?

于 2013-01-21T19:57:37.520 に答える
2

あなたの質問

SELECT *
FROM teams 
INNER JOIN players
    ON teams.ID = players.Team

あなたが望むものです。それはあなたに余分なを与えません、それはあなたにもっと多くのを与えます。両方のテーブルの列が結果セットに含まれます。2つのクエリを自分で連結しようとするよりもはるかに効率的です。

チームのリストを生成するための擬似コードは次のようになります。

while dr.Read()
   if (Teams.Contains(dr["Team"])
       add team to Teams
   find Team by ID
   add Player to Team

別の方法として、結果セット全体DataTableをusingに読み込んでからDataTable.Load()、句を含むLinqクエリを使用して、group byセット全体を1回のショットで取得することもできます。

于 2013-01-21T19:57:30.270 に答える