我有以下表格:
队:
ID Name
------ ---------
1 Giants
2 Yankees
3 Cool Guys
PLAYERS:
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,我正在尝试获取所有团队,包括玩家的列表。
有没有办法通过单个查询执行此操作?
this question的解决方案非常接近; 我正在考虑将玩家列表作为单个字符串然后拆分它们,但它没有帮助,因为我需要所有玩家的详细信息(名称,ID等),此外,它感觉就像一个肮脏的把戏。 / p>
我考虑的另一件事就是这样查询:
select *
from TEAMS join PLAYERS
on TEAMS.ID = PLAYERS.Team
...(因此得到额外的行)然后使用linq集中结果,但我不确定这是多么有效。
那么,有什么好主意吗?
答案 0 :(得分: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。然后你只需要遍历结果,检查你的队列中是否已经存在,如果没有,则添加它,然后将玩家添加到玩家列表中。
这会回答你的问题吗?
答案 1 :(得分: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
作为替代方案,您可以使用DataTable.Load()
将整个结果集读入DataTable
,然后使用带有group by
子句的Linq查询一次性获取整个集合。