C # Где с несколькими значениями

#c# #model-view-controller #where-clause

#c# #model-view-controller #where-предложение

Вопрос:

Итак, для моего текущего проекта я пытаюсь показать все сообщения с теми же темами, которые пользователь добавляет в избранное.

Теперь поиск всех сообщений по одной теме работает нормально, но я хочу получить все.

 var posts = db.Posts.Where(x => x.SubjectID == currentUser.Favourites.SubjectID);
  

Это то, что я пробовал, но, к сожалению, это не работает, он не может найти SubjectID, вероятно, потому, что избранное CurrentUser неисчислимо.
Есть ли что-нибудь для сравнения с несколькими значениями, которые могут быть в избранном текущего пользователя?

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

1. Итак, вы хотите проверить, содержит ли IEnumerable (предположительно Int / String) значение идентификатора темы сообщений, подобное этому … db.Posts.Where(x => currentUser.Favourites.Contains(x.SubjectID)); ?

2. В принципе, да, но когда я пробую ваш фрагмент кода, проблема в том, что избранное само по себе является объектом с идентификатором пользователя, идентификатором субъекта и его собственным идентификатором. Итак, на данный момент он не может сравниться с x.SubjectID, поскольку сам favorites не является int.

3. @Wulfae: вместо того, чтобы нам гадать, как выглядит ваш код, пожалуйста, предоставьте нам достаточно информации, чтобы мы могли вам помочь. Нам не нужно угадывать тип Posts or currentUser или currentUser.Favourites и т. Д.

4. Извините, я не очень привык обращаться за помощью онлайн, обычно у меня есть кто-то, кто может показать мой код. Но, похоже, сейчас он работает, используя советы @Adriani6.

5. Это то, что сделало трюк, сначала создав список всех SubjectID, добавленных в список<int> currentUserFavouriteSubjects = new List<int>(); var CurrentUser = db.Users . Где(x => x.имя пользователя == Пользователь. Identity.Name ). First(); foreach (var избранное в CurrentUser.Favorites) { if (!currentUserFavouriteSubjects. Содержит (избранное. SubjectID)) currentUserFavouriteSubjects. Добавить (избранное. SubjectID); } var posts = db.Posts. Где(x => currentUserFavouriteSubjects. Содержит(x.SubjectID)); возвращает представление (сообщения. ToList());

Ответ №1:

Вы можете использовать любой внутри вашего Where:

 db.Posts.Where(x => currentUser.Favourites.Any(f => f.SubjectID ==x.SubjectID));
  

Ответ №2:

Создайте список SubjectID из избранного, а затем передайте этот список в ваше предложение where.

 var subjectIDs = currentUser.Favourites.Select(x => x.SubjectID).ToList();
var posts = db.Posts.Where(x => subjectIDs.Equals(x.SubjectID));
  

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

1. Ах, спасибо! Я только что это сделал, но ваш способ написания кажется лучше, чем мой цикл foreach

2. Это должно быть subjectIDs.Contains(x.SubjectID) . Использование Equals для a List<int> и an int никогда не будет истинным.