#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
orcurrentUser
или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
для aList<int>
и anint
никогда не будет истинным.