SQL Server加入/子选择问题

时间:2011-03-14 15:57:18

标签: .net sql sql-server ado.net

我在数据库中有两个表

Team:Id(int PK), Name(nvarchar)

Player:Id(int PK), Name(nvarchar), Age(int), TeamId(int FK)

我还有以下课程

class Team
{
   public int Id{get;set;}
   public string Name{get;set;}
}

class Player
{
   public int Id{get;set;}
   public string Name{get;set;}
   public int Age{get;set;}
   public int TeamId{get;set;}
}

class TeamInfo
{
   public Team Team{get;set;}
   public List<Player> Players{get;set;}
}

我想从数据库中提取List<TeamInfo>。 我正在使用Ado.net,没有ef或linq2sql ......我问的是查询数据库的最佳方法是什么?

现在我得到了所有球队,并且每个球队都通过联赛查询桌面球员,但肯定这不是最佳方式。

2 个答案:

答案 0 :(得分:1)

我在sql server中使用参数@teamid创建一个sp,然后为团队执行sp并获取播放器信息

create procedure [dbo].[TeamPlayers]
as

@teamid int
begin

    set nocount on;

select
    t.ID as TeamID,
    t.name,
    p.ID as PlayerID,
    p.name,
    p.age
from dbo.Player p
    inner join Team t
        on p.TeamID=t.ID
where t.ID=@teamid


end

答案 1 :(得分:0)

您应该使用join查询从数据库中读取所有信息:

SELECT 
       Team.Id as TeamId,
       Team.Name as TeamName,
       Player.Id as PlayerId,
       Player.Name as PlayerId,
FROM Team INNER JOIN Player on Team.Id = Player.TeamId

将此查询作为SqlCommand的一部分使用,并将数据导入DataTable。然后:

var teamInfos = datatable.Rows
                    .Cast<DataRow>()
                    .GroupBy(dr => (int) dr["TeamId"])
                    .Select(t => new TeamInfo
                       {
                           Team = new Team{ Id = t.Key, 
                                            Name = (string)t.First["TeamName"] },
                           Players = t.Select(p => new PlayerInfo {
                                      Id = (int)p["PlayerId"],
                                      Name = (int)p["PlayerName"],
                                      // other player fields here
                                 })
                                 .ToList()
                       });

注意:您可能需要LEFT加入此INNER,而不是{{1}},因为否则您将无法获得没有玩家的团队。