使用DataReader将许多行集中到列表中

时间:2013-01-21 19:53:53

标签: c# sql linq datareader

我有以下表格:

队:

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集中结果,但我不确定这是多么有效。

那么,有什么好主意吗?

2 个答案:

答案 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查询一次性获取整个集合。