Linq每次出现值,绑定到ViewModel

时间:2015-07-23 10:43:39

标签: c# linq

我需要获得一个玩家列表和所有与该玩家相关联的团队并将其添加到我的ViewModel。

视图模型

var distance = $('#menu').offset().top; 

    $(window).scroll(function () {

         if ($(window).scrollTop() >= distance) {
             $('#menu').addClass("navbar-fixed-top");
         } else {
             $('#menu').removeClass("navbar-fixed-top");
         }
     });

我有几个不同的数据表:

  • PlayersInTeams(链接表)
Remove maxlength="{{maxlength}}" of INPUT tag in $templateCache.put(TEMPLATE_URL,..... (angucomplete-alt.js)
  • 球员
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
}

因此,对于上面的示例表,Player 1 - John Doe应该在ViewModel中有一个包含2个teamID的数组+------------+---------+ | PlayerID | TeamID | +------------+---------+ | 1 | 10001 | | 1 | 10002 | | 2 | 10002 | | 3 | 10001 | +------------+---------+

目标

我正在尝试拥有一个TeamIDs集合+------------+---------+-----------+ | PlayerID | ForeName| Surname | +------------+---------+-----------+ | 1 | John | Doe | | 2 | Pete | Noe | | 3 | Evan | Soe | +------------+---------+-----------+

代码

[10001, 10002].

我收到了List<PlayersViewModel>个玩家ID,显然我的TeamID没有填充。

有任何建议/解决方案吗?

3 个答案:

答案 0 :(得分:1)

尝试这样的事情:

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();

总的来说,在我看来,你正试图从错误的一端解决问题。你首先需要一个玩家列表,然后是他们的团队第二个,而不是第一个玩家团队关联列表,第二个是玩家详细信息,所以你应该从playerDetail对象开始(我假设它是{{1}所有IEnumerable个对象)。

旁注:请注意,您可以在Player类中添加一个getter,它将为您提供全名,而无需始终连接名称和姓氏。类似的东西:

Player

答案 1 :(得分:1)

var results = yourContext.Players
        .Select(p => new PlayersViewModel 
        {
            PlayerID = p.PlayerID,
            PlayerName = p.PlayerName,
            TeamID = context.PlayersInTeams.Where(x => x.PlayerID == p.PlayerID)
        }).ToList();

答案 2 :(得分:0)

您需要使用group将它们分组:

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

Check this working Fiddle example