我在数据库中有两个表
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 ......我问的是查询数据库的最佳方法是什么?
现在我得到了所有球队,并且每个球队都通过联赛查询桌面球员,但肯定这不是最佳方式。
答案 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}},因为否则您将无法获得没有玩家的团队。