Невозможно создать постоянное значение типа x, в этом контексте поддерживаются только примитивные типы или типы перечисления - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь преобразовать инструкцию 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'. В этом контексте поддерживаются только примитивные типы или типы перечисления."

1 Ответ

0 голосов
/ 26 мая 2018

Ваши соглашения об именах вам не помогут:

public virtual ApplicationUser UserName { get; set; }

Это не имя пользователя, это пользователь.В этой таблице также отсутствует свойство для фактического хранения отношения, а также свойство для хранения GameNight Id.Свойство Attendance также не имеет большого смысла, поскольку у вас нет оснований для создания GamesNightAttendance с 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
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...