使用 DataReader 将许多行集中到列表中
Posted
技术标签:
【中文标题】使用 DataReader 将许多行集中到列表中【英文标题】:Concentrate many rows into list using a DataReader 【发布时间】:2013-01-21 19:53:52 【问题描述】:我有以下表格:
团队:
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,我正在尝试获取所有球队的列表,包括球员。
有没有办法通过单个查询来做到这一点?
this question 的解决方案非常接近; 我正在考虑将玩家列表作为单个字符串,然后将它们拆分,但这并没有帮助,因为我需要所有玩家的详细信息(姓名、ID 等),此外,这感觉像是一个肮脏的把戏。
我考虑的另一件事是这样查询:
select *
from TEAMS join PLAYERS
on TEAMS.ID = PLAYERS.Team
...(因此获得额外的行),然后使用 linq 集中结果,但我不确定这样做的效率如何。
那么,有什么好主意吗?
【问题讨论】:
【参考方案1】: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。然后你只需要遍历结果,检查团队是否已经存在于你的列表中,如果不存在则添加它,然后将玩家添加到玩家列表中。
这能回答你的问题吗?
【讨论】:
这是我考虑的选项之一。它真的是最好的选择,还是有更好的方法? 我会这样做。这个网站上有一些非常聪明的人,所以也许有更好的方法。【参考方案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 查询一次性获取整个结果集。
【讨论】:
以上是关于使用 DataReader 将许多行集中到列表中的主要内容,如果未能解决你的问题,请参考以下文章