Сконцентрируйте много строк в списке с помощью DataReader

У меня есть следующие таблицы:

КОМАНДЫ:

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, я пытаюсь получить список всех команд, включая игроков.

Есть ли способ сделать это с помощью одного запроса?

Решения для этого вопроса довольно близки;
Я думал о том, чтобы получить список игроков в виде одной строки, а затем разделить их, но это не помогает, потому что мне нужны все данные игроков (имена, идентификаторы и т. Д.), И, кроме того, это похоже на подвох.

Еще я подумал о таких запросах:

select *
from TEAMS join PLAYERS
on TEAMS.ID = PLAYERS.Team

... (таким образом получаются дополнительные строки), а затем концентрируют результаты с помощью linq, но я не уверен, насколько это эффективно.

Итак, есть какие-нибудь яркие идеи?


person Yehuda Shapira    schedule 21.01.2013    source источник


Ответы (2)


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. Затем вам просто нужно просмотреть результаты, проверить, существует ли уже команда в вашем списке, и добавить ее, если нет, а затем добавить игрока в список игроков.

Это ответ на ваш вопрос?

person Daniel Kelley    schedule 21.01.2013
comment
Это один из рассмотренных мной вариантов. Действительно ли это лучший вариант или есть способ лучше? - person Yehuda Shapira; 21.01.2013
comment
Я бы так поступил. На этом сайте есть очень умные люди, так что, возможно, есть способ получше. - person Daniel Kelley; 22.01.2013

Ваш запрос

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, используя DataTable.Load(), а затем используйте запрос Linq с предложением group by, чтобы получить весь набор за один раз.

person D Stanley    schedule 21.01.2013