У меня есть две сущности: User
и Notice
, они связаны между собой через таблицу DismissedNoticeToUser
(UserId
и NoticeId
- соответствующие столбцы).
Вот мое отображение FluentNHibernate для класса User
:
mapping.HasManyToMany<Notice>(u => u.DismissedNotices)
.Table("DismissedNoticeToUser")
.ParentKeyColumn("UserId")
.ChildKeyColumn("NoticeId")
.Inverse();
Каждый раз, когда пользователь «отклоняет» уведомление, в класс DismissedNoticeToUser
добавляется пара User.Id
и Notice.Id
. Это легко в коде:
var notice = this.session.Load<Notice>(noticeId);
var user = this.session.Load<User>(this.userSession.Id);
user.DismissedNotices.Add(notice);
Если я хочу перечислить все уведомления , а не , отклоненные пользователем, я пишу что-то вроде этого в сыром SQL:
select * from [Notice]
where Id not in
(select NoticeId from [DismissedNoticeToUser] where UserId=@userId)
Однако я не совсем уверен, как сделать то же самое с помощью NHibernate. Я пробовал следующее, но он выполняет левое соединение в уведомлениях пользователя как отдельный запрос.
this.session.Query<Notice>().Where(n => !user.DismissedNotices.Contains(n));
Я мог бы остановиться и использовать NHibernate для написания необработанного SQL, но я чувствую, что, возможно, что-то упустил. Мне все равно, какой API запросов NHibernate я использую.