首页 > 解决方案 > 无法创建 x 类型的常量值,此上下文仅支持原始类型或枚举类型

问题描述

我正在尝试将 SQL 语句转换为 LINQ。

我有这些模型:

public class GamesNight
{
    public int id { get; set; }

    [DisplayName("Games Night Official Name")]
    public string EventName { get; set; }

    [DisplayName("Description")]
    public string EventDescription { get; set; }
    [DisplayName("Date and Time")]
    [DataType(DataType.Date)]
    public DateTime DateTime { get; set; }

    public virtual ApplicationUser User { get; set; }

    public bool Active { get; set; }
}

和 GamesNightAttendance,这或多或少将用户链接到游戏之夜活动。

public class GamesNightAttendance
{
    [Key]
    public int id { get; set; }
    public virtual GamesNight GameNight { get; set; }
    public virtual ApplicationUser UserName { get; set; }
    public bool Attendance { get; set; }
}

因此,一个用户主持了 GamesNight,然后其他用户将能够通过 gamesnightattendancemodel 参加游戏之夜。

我的查询是:

var userID = User.Identity.GetUserId();
var user = db.Users.First(x => x.Id == userID);

var result = from GNS in db.GamesNights
    join GNA in db.GamesNightAttendance on GNS.id equals GNA.id
    where GNS.Active & GNA.UserName == user
    select new UpcomingGNAttendanceViewModel { GamesNight = GNS, Attendance = GNA.Attendance};

我得到了例外:

Message = "无法创建类型为 'GNR.Models.ApplicationUser' 的常量值。在此上下文中仅支持原始类型或枚举类型。"

标签: c#entity-frameworklinq

解决方案


您的命名约定对您没有帮助:

public virtual ApplicationUser UserName { get; set; }

那不是用户名,那是用户。该表还缺少一个实际保存关系的属性,以及保存GameNightId 的属性。该Attendance属性也没有多大意义,因为您没有理由创建GamesNightAttendancewith Attendance = false

该类应该看起来更像这样:

public class GamesNightAttendance
{
    public int Id { get; set; }
    // add missing foreign key
    public int GameNightId { get; set; }
    // add missing foreign key
    public int UserId { get; set; }

    public virtual GamesNight GameNight { get; set; }
    // fix name
    public virtual ApplicationUser User { get; set; }
}

使用该模型,您现在可以执行以下操作:

var userId = User.Identity.GetUserId();

var result = 
    from gameNight in db.GamesNights
    join attendance in db.GamesNightAttendance on gameNight.Id equals attendance.Id
    where gameNight.Active && attendance.UserId == userId
    select new UpcomingGNAttendanceViewModel 
    { 
        GamesNight = gameNight, 
        Attendance = attendance
    };

推荐阅读