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,我试图获取所有团队的列表,包括球员。

有没有办法用一个查询来做到这一点?

这个问题的解决方案非常接近;
我正在考虑将玩家列表作为单个字符串,然后将它们拆分,但这并没有帮助,因为我需要所有玩家的详细信息(姓名、ID 等),此外,这感觉像是一个肮脏的把戏。

我考虑的另一件事是这样查询:

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

是你想要的。它不会给你额外的,它给你更多的。两个表中的列都在您的结果集中。尝试自己连接两个查询会更有效率。

您用于生成团队列表的伪代码可能是:

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

作为替代方案,您可以将整个结果集读入DataTableusing 中DataTable.Load(),然后使用带有group by子句的 Linq 查询一次性获取整个结果集。

于 2013-01-21T19:57:30.270 回答