Выбор на основе строки в списке C # LINQ

#c# #asp.net-mvc #linq-to-entities

#c# #asp.net-mvc #linq-to-entities (ссылки на объекты)

Вопрос:

Итак, у меня есть класс с именем event, который содержит список ListofInvites, в нем есть адреса электронной почты другого пользователя (другой класс, у которого есть свойство emailid), теперь я хочу выбрать все события на основе того, содержит ли строка listofinvites это конкретное электронное письмо

Я пробовал это, но получаю сообщение об ошибке

 var userEmailID = this.User.Identity.GetUserName();


var events = this.dataBase.Events
       .OrderBy(e => e.DateAndTime)
       .Where(e => e.listOfInvites.Contains(userEmailID))
       .Select(EventViewModel.ViewModel);
  

Да, извините, я спешил прошлой ночью, когда публиковал это

Итак, у меня есть этот класс событий

 public class Event
{
    public Event()
    {
        this.IsPublic = true;
        this.DateAndTime = DateTime.Now;
    }
    [Key]
    public int EventID { get; set; }

    [Required]
    [MaxLength(200)]
    public string Title { get; set; }

    [Required]
    public DateTime DateAndTime { get; set; }

    public string AuthorId { get; set; }
    public int Duration { get; set; }
    public string Description { get; set; }
    public string OtherDetails { get; set; }
    [MaxLength(200)]
    public string Location { get; set; }
    public bool IsPublic { get; set; }
    public IEnumerable<string> listOfInvites { get; set; }

    public string  InviteList { get; set; }
}
}
  

ошибка, которую я получаю, заключается в

System.NotSupportedException: 'The specified type member 'listOfInvites' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.'

Комментарии:

1. Пожалуйста, укажите класс Invite, EventViewModel. Код ViewModel, а также сообщение об ошибке.

2. Я отредактировал это сейчас

Ответ №1:

В Event сущности вы объявляете IEnumerable<string> свойство ( listOfInvites ), в то время как список примитивных типов не поддерживается в Entity Framework, и поскольку это свойство не сопоставлено со столбцом базы данных, вы не можете использовать его в выражении where.
Вам нужно создать другой объект (следовательно, таблицу) для ListOfInvites с внешним ключом к Event объекту.

Ответ №2:

Надеюсь, приведенный ниже код решит вашу проблему.

события var = База данных.Мероприятия.Где(p => p.listOfInvites.Содержит(userEmailID)).ToList();

Ответ №3:

Это помогло бы увидеть ваши классы, но я предполагаю, что у вас есть список некоторых названных классов Event в вашей базе данных, у каждого из которых есть List<Invite> свойство, а затем EmailId string свойство для каждого из этих Invite экземпляров. В этом случае, поскольку ваше EmailId свойство само по себе Event не является свойством, вам придется перебирать каждое событие, List<Invite> чтобы получить EmailId связанное с ним. Я предполагаю, что отношения следующие: Много событий в вашей базе данных; много приглашений для каждого Event ; и по EmailID одному для каждого Invite .

Следуя этим предположениям, я бы сделал это:

 var events = this.database.Events.Where(e => e.ListOfInvites.Any(i => i.EmailId.Contains(userEmailId))).ToList();
  

Итак, из каждого события в (предположительно) List<Event> вашей базе данных мы будем выполнять поиск по каждому приглашению в его ListOfInvites свойстве (это e => e.ListOfInvites часть), ища любое приглашение, в котором оно EmailId совпадает с тем, которое мы передали, т.Е.: i => i.EmailId.Contains(userEmailId) .
Затем это var станет List<Event> представлением всех событий, на которые приглашен наш пользователь.

Комментарии:

1. Я отредактировал свой вопрос, можете ли вы взглянуть на него сейчас?