Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq每次出现值时,绑定到ViewModel_C#_Linq - Fatal编程技术网

C# Linq每次出现值时,绑定到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

我需要得到一个球员列表和每个球队说,球员是相关联的,并将其添加到我的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 teams
}
  • 球员
因此,对于上面的示例表,播放器1-John Doe在ViewModel中应该有一个由2个TeamID组成的数组。[100011002].

目标

我正在尝试创建一个包含TeamID集合的
列表

代码

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
                 };