使用 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 将许多行集中到列表中的主要内容,如果未能解决你的问题,请参考以下文章

如何在C#中使用存储过程和datareader返回记录列表

DataReader.Read() 跳过记录集的第一行

如何通过DataReader / DataTable进行查看?

遇到“DataReader 已打开”的问题

将许多语句加载到 Jena 数据集中的最有效方法是啥?

使用 datareader 用数据库多列中的数据填充文本框