【问题标题】:Sql server join/subselect questionSql server 加入/子选择问题
【发布时间】:2011-03-14 15:57:18
【问题描述】:

我在数据库中有两个表

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&lt;TeamInfo&gt;。 我正在使用 Ado.net,没有 ef 或 linq2sql...我在问什么是查询 db 的最佳方法?

现在我获取所有团队,并且对于每个团队,我都会通过 join 查询表中的玩家,但可以肯定这不是最好的方法。

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      你应该使用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 加入,否则您将无法获得没有球员的球队。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-01
        • 2021-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多