#vb.net #entity-framework #sql
#vb.net #entity-framework #sql
Вопрос:
SELECT dbo.Calls.Description, dbo.TicketRead.IsRead, dbo.TicketRead.UserID
FROM dbo.Calls
LEFT OUTER JOIN dbo.TicketRead ON dbo.Calls.CallID = dbo.TicketRead.TicketID
WHERE dbo.TicketRead.UserID = 1 or is null
Я хочу получить список всех вызовов, а также значение, указывающее, прочитал ли пользователь вызов. итак, я сделал, когда пользователь открывает тикет, новая запись добавляется в специальную таблицу.
теперь, если ни один пользователь не прочитал это, тогда все в порядке, но если только один пользователь прочитал этот запрос, то у других пользователей нет этого вызова в списке..
Я использую msSql и .net entity framework.
Ответ №1:
Вы уверены, что хотите ограничить таблицу TicketRead только идентификатором пользователя # 1?
SELECT c.Description, r.IsRead, r.UserID
FROM dbo.Calls c
LEFT JOIN dbo.TicketRead r
ON c.CallID = r.TicketID
AND r.UserID = 1
Это выполняется при объединении на нескольких условиях… Вы получите все вызовы, но только флаг isRead из TicketRead, когда идентификатор пользователя # 1 прочитает его.
Я не уверен, что это действительно то, что вы ищете, и я буду доступен для обновления этого позже, если нет.
Также, пожалуйста, рассмотрите возможность использования псевдонимов таблиц в будущем, я думаю, вам это понравится.
Комментарии:
1. Спасибо за то, что это работает!. но как бы я это сделал из entity framework?
Ответ №2:
вы хотите сделать следующее:
SELECT dbo.Calls.Description, dbo.TicketRead.IsRead, dbo.TicketRead.UserID
FROM dbo.Calls
LEFT OUTER JOIN dbo.TicketRead ON dbo.Calls.CallID = dbo.TicketRead.TicketID
WHERE
dbo.TicketRead.UserID = 1
or dbo.TicketRead.CallID IS NULL
по сути, мы говорим здесь, что если есть идентификатор пользователя, он должен быть равен 1. в противном случае первичный ключ записи равен null (из-за объединения). Ответ Фоско тоже правильный и намного меньше 🙂