C# Linq每次出现值时,绑定到ViewModel
我需要得到一个球员列表和每个球队说,球员是相关联的,并将其添加到我的ViewModel 视图模型C# Linq每次出现值时,绑定到ViewModel,c#,linq,C#,Linq,我需要得到一个球员列表和每个球队说,球员是相关联的,并将其添加到我的ViewModel 视图模型 public class PlayersViewModel { public long PlayerID { get; set; } public string PlayerName { get; set; } public List<long> TeamID { get; set; } //Players can be assigned to 1 or more
public class PlayersViewModel
{
public long PlayerID { get; set; }
public string PlayerName { get; set; }
public List<long> TeamID { get; set; } //Players can be assigned to 1 or more teams
}
- 球员
列表
代码
public List<PlayersViewModel> GetPlayers()
{
var playersInTeam = new PlayersInTeamsBLL();
var pit = playersInTeam.GetPlayersInTeams();
var playerDetail = Players;
var list = from p in pit
join team in Teams on p.TeamID equals team.TeamID // Only get teams that related to club
join pd in playerDetail on p.PlayerID equals pd.PlayerID //Link a player to
where pd.IsArchived == false
select new PlayersViewModel { TeamID = team.TeamID, PlayerID = p.PlayerID, PlayerName = pd.Forename + " " + pd.Surname};
return list.ToList();
}
public List GetPlayers()
{
var playersInTeam=新的PlayersInTeamsBLL();
var pit=playersInTeam.GetPlayersInTeams();
var playerDetail=玩家;
var list=来自坑中的p
在p.TeamID等于team.TeamID//上加入团队,仅获取与俱乐部相关的团队
p.PlayerID等于pd.PlayerID//将玩家链接到
其中pd.IsArchived==false
选择新的PlayerViewModel{TeamID=team.TeamID,PlayerID=p.PlayerID,PlayerName=pd.Forename+“”+pd.姓氏};
return list.ToList();
}
我得到了null
PlayerIDs,显然我的团队ID没有被填充
有什么建议/解决方案吗?试试这样的方法:
var viewModels = playerDetail.Select(p => new PlayersViewModel()
{
PlayerID = p.PlayerID,
PlayerName = String.Format("{0} {1}", p.ForeName, p.Surname),
TeamID = pid.Where(pidElement => pidElement.PlayerID == p.PlayerID)
.Select(pidElement => pidElement.TeamID).ToList()
}).ToList();
var teamsFinal = from p in pit
join pd in playerDetail on p.PlayerID equals pd.PlayerID
where pd.IsArchived == false
group new {p,pd} by new
{
pd.PlayerID ,
pd.ForeName,
pd.SurName
} into g
select new PlayersViewModel
{
TeamID = g.Select(x => x.p.TeamID).ToList(),
PlayerID = g.Key.PlayerID,
PlayerName = g.Key.ForeName + " " + g.Key.SurName
};
总的来说,在我看来,你试图从错误的角度解决这个问题。您首先需要一个玩家列表,然后是他们的团队,而不是一个玩家团队关联列表,然后是玩家详细信息,因此您应该从playerDetail
对象开始(我假设它是所有player
对象的IEnumerable
)
一个旁注:考虑到你可以在你的<代码>播放器类中添加一个吸收器,它可以给你全名而不需要总是连接名字和姓氏。比如:
public string FullName
{
get { return String.Format("{0} {1}", this.FirstName, this.Surname); }
}
您需要使用group by将其分组,如下所示:
var viewModels = playerDetail.Select(p => new PlayersViewModel()
{
PlayerID = p.PlayerID,
PlayerName = String.Format("{0} {1}", p.ForeName, p.Surname),
TeamID = pid.Where(pidElement => pidElement.PlayerID == p.PlayerID)
.Select(pidElement => pidElement.TeamID).ToList()
}).ToList();
var teamsFinal = from p in pit
join pd in playerDetail on p.PlayerID equals pd.PlayerID
where pd.IsArchived == false
group new {p,pd} by new
{
pd.PlayerID ,
pd.ForeName,
pd.SurName
} into g
select new PlayersViewModel
{
TeamID = g.Select(x => x.p.TeamID).ToList(),
PlayerID = g.Key.PlayerID,
PlayerName = g.Key.ForeName + " " + g.Key.SurName
};
你完全正确@Shaaman。只需插入您的代码,它就可以运行得很好。是的,关于球员的细节你是对的,我从错误的一端攻击它。还有,很好的建议,我也要补充一下。谢谢你的帮助!非常感谢。还有一件事,@Jezzabeanz。。。可能只是我,所以拿着这个放一撮盐。。。但我发现使用LINQ查询语法只有在必须进行连接时才有用。在大多数情况下,方法语法似乎更清晰。但正如我所写的——这可能纯粹是主观的。我完全同意,我只在进行连接时使用查询语法,我认为出于某种原因我必须这样做。干杯@Jezzabeanz供参考:)
var teamsFinal = from p in pit
join pd in playerDetail on p.PlayerID equals pd.PlayerID
where pd.IsArchived == false
group new {p,pd} by new
{
pd.PlayerID ,
pd.ForeName,
pd.SurName
} into g
select new PlayersViewModel
{
TeamID = g.Select(x => x.p.TeamID).ToList(),
PlayerID = g.Key.PlayerID,
PlayerName = g.Key.ForeName + " " + g.Key.SurName
};