【发布时间】:2023-03-20 16:00:02
【问题描述】:
对于以下内容(我使用的是 EF4),我需要选择线程 (ContactThreadId) 中给定 LoginId 尚未读取的所有消息
所以,我基于 ContactThreadId 和 LoginId 我需要知道这个 LoginId 是否已经阅读了线程中的所有消息。如果不是,我需要用他/她的 LoginId 以及她/他何时阅读该线程中的所有消息来更新 ContactReadState。
我已经尝试了这些,但卡住了:
// Update read state
var thread = this.contactMessageThreadRepository.GetRow(id);
var loginEntity = this.loginRepository.GetRow(ProfileContext.LoginId);
var unreadMsg = loginEntity.Contact
.Where(x => x.ContactThread.Any(y => y.ContactThreadId == id))
.Select(b => b.ContactMessage.FirstOrDefault())
.Where(q => q.ContactReadState.Count() == 0);
var unreadMsg = loginEntity.Contact
.Where(x => x.ContactThread.Any(y => y.ContactThreadId == id))
.Where(y => y.ContactReadState.Any(q => q.ContactId != loginEntity.ContactId));
var msg = thread.Contact
.Where(x => x.LoginId == loginEntity.LoginId)
.Where(y => y.ContactReadState.Count() == 0);
请帮忙。 谢谢
编辑:
登录 - 此表保存登录/管理记录
Contact - 此表包含所有联系人(包括 Login 项,因为 Logins 也可以参与对话 - 可以回复消息等)当 LoginId 在联系人表中是NOT NULL,这意味着它是一个登录用户,否则它是一个公共用户提交消息。
QUESTION -> 每个 Login 只能有 1 个 Contact 记录(我有一个触发器在 Login 时创建 Contact 记录 创建)。我如何使它成为 1 比 1.?? 我从 Contact 到 Login 表中添加了一个 FK,但由于某种原因,EF 创建了 0..1 -> * 关联。它应该是 1 比 1。对于给定的登录名,只能有 1 个与该 LoginId 联系的联系人。
每当 Login 正在查看消息列表时,都会向该 Login 的 ContactReadState 插入一条新记录(标记该 Login 已阅读的消息(带有该 Login 的 ContactId)。
【问题讨论】:
-
见鬼,你的格式真的很难阅读。我希望,我已经使换行符在逻辑上是正确的。
标签: linq entity-framework linq-to-entities