我在使用.Net/EF Core时遇到问题,我的一个视图模型构造函数中的select语句在运行时返回以下错误:Property 'System.String Name' is not defined for type 'Microsoft.EntityFrameworkCore.Storage.ValueBuffer'
。
我试着对我怀疑导致问题的原因进行评论,并将其缩小到这个范围,但我不知道我所做的是什么问题。
以下是导致错误的表达式:
playerholder = players.Select(m => new PlayerListItem_PDMI
{
PlayerID = m.PlayerID,
FirstName = m.FirstName,
LastName = m.LastName,
Rating = m.Rating,
Assigned = m.TeamAssignments.Where(n => n.Team.League == league && n.SeasonID == SeasonID).Count() > 0,
TeamName = (m.TeamAssignments.Where(n => n.Team.League == league && n.SeasonID == SeasonID).Count() > 0 ? m.TeamAssignments.Where(n => n.Team.League == league && n.SeasonID == SeasonID).First().Team.Name : "Not Assigned")
}).ToList();
具体线路为
TeamName = (m.TeamAssignments.Where(n => n.Team.League == league && n.SeasonID == SeasonID).Count() > 0 ? m.TeamAssignments.Where(n => n.Team.League == league && n.SeasonID == SeasonID).First().Team.Name : "Not Assigned")
我在这里错过了什么?
注意:正在查询的数据库完全为空。记录检查应返回false,并使三元表达式返回"未分配"
编辑:
TeamAssignment类如下:
public class TeamAssignment : IModel
{
public TeamAssignment()
{
}
public TeamAssignment(WWAHLContext db)
{
Season = db.Seasons.Last();
}
[Key]
public int ID { get; set; }
public int PlayerID { get; set; }
public int SeasonID { get; set; }
public int TeamID { get; set; }
public int PlayerNumber { get; set; }
public Position Position { get; set; }
[ForeignKey("PlayerID")]
public virtual Player Player { get; set; }
[ForeignKey("TeamID")]
public virtual Team Team { get; set; }
[ForeignKey("SeasonID")]
public virtual Season Season { get; set; }
}
团队级别如下:
public class Team : IModel
{
public int TeamID { get; set; }
public int SeasonID { get; set; }
public League League { get; set; }
public string Name { get; set; }
public virtual TeamStats TeamStats { get; set; }
public virtual TeamCarousel Carousel { get; set; }
public virtual ICollection<GameDetails> Games { get; set; }
public virtual ICollection<CurrentTeam> CurrentPlayers { get; set; }
[NotMapped]
public virtual IEnumerable<Penalty> Penalties => Games.SelectMany(m => m.Penalties);
}
我通过使用如下连接(为左外部连接编辑)解决了这个问题:
playerholder = players.GroupJoin(db.TeamAssignments, player => player.PlayerID, assignment => assignment.PlayerID, (player, assignment) => new
{
PlayerID = player.PlayerID,
FirstName = player.FirstName,
LastName = player.LastName,
Rating = player.Rating,
NameLeague = assignment.Where(m => m.SeasonID == seasonId).Join(db.Teams, assign => assign.TeamID, team => team.TeamID, (assign, team) => new
{
League = team.League,
Name = team.Name
}).Where(m => m.League == league)
}).Select(m => new PlayerListItem_PDMI
{
PlayerID = m.PlayerID,
FirstName = m.FirstName,
LastName = m.LastName,
Rating = m.Rating,
Assigned = m.NameLeague.Any(),
TeamName = (m.NameLeague.Any() ? m.NameLeague.First().Name : "Not Assigned")
}).ToList();
首先,让我们从中进行一个合理的查询。。。。。
playerholder = from m in players
let team = m.TeamAssignments.FirstOrDefault(n => n.Team.League == league && n.SeasonID == SeasonID)
select new PlayerListItem_PDMI
{
PlayerID = m.PlayerID,
FirstName = m.FirstName,
LastName = m.LastName,
Rating = m.Rating,
Assigned = team != null,
TeamName = team != null ? team.Name : "Not Assigned")
}).ToList();
只需先尝试一下,看看它是否有效,或者给出相同的错误。由于错误引用了ValueBuffer
,我猜.Name
所附加的对象不是Team
对象——可能是因为在那个混乱中放错了括号。。。