gpt4 book ai didi

c# - 如何将 'where not in' 转换为子查询表不是实体的 NHibernate 查询?

转载 作者:行者123 更新时间:2023-11-30 22:30:42 24 4
gpt4 key购买 nike

我有两个实体:UserNotice,它们通过 DismissedNoticeToUser 表链接在一起(UserIdNoticeId 是各自的列)。

这是我对 User 类的 FluentNHibernate 映射:

mapping.HasManyToMany<Notice>(u => u.DismissedNotices)
.Table("DismissedNoticeToUser")
.ParentKeyColumn("UserId")
.ChildKeyColumn("NoticeId")
.Inverse();

每次用户“关闭”通知时,都会将一对 User.IdNotice.Id 添加到 DismissedNoticeToUser类(class)。这在代码中很容易:

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,但我觉得我可能遗漏了什么。我不关心我使用哪个 NHibernate 查询 API。

最佳答案

如果您无法将用户映射到通知,请尝试针对查询编写查询代码。我没有尝试将 Load to Query 结合使用,使用 Load against Query 可能会导致 NH 生成单独的查询。

试试这个:

this.session.Query<Notice>().Where( n => 
this.session.Query<User>().Any(u => u.UserId == "007"
&& !u.DismissedNotices.Contains(n) );

关于c# - 如何将 'where not in' 转换为子查询表不是实体的 NHibernate 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9587934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com