[英]How to get a list of user dialogs from the database of all messages using Entity Framework Core
我在数据库中有一个带有消息的表,即:
| Id | FromId | ToId | Text | Date | Read |
这是 class 的样子:
public class Message
{
public int Id { get; set; }
public IdentityUser From { get; set; }
public IdentityUser To { get; set; }
public string Text { get; set; }
public DateTime Date { get; set; }
public bool Read { get; set; }
}
我需要使用 Entity Framework Core 形成一个请求以获取所有用户对话框的列表。 我已经勾勒出一个示例 SQL 查询:
SELECT FromId, MAX(Date) as updated_at, sum(Read) as new_messages
FROM (SELECT FromId, Date, Read
FROM Messages
WHERE ToId = 'f3578a36-208c-4504-8f3c-afa564455537'
UNION SELECT ToId, Date, 0
FROM Messages
WHERE FromId = 'f3578a36-208c-4504-8f3c-afa564455537'
ORDER BY Date DESC) as talks
GROUP BY FromId
ORDER BY Date DESC;
其中“f3578a36-208c-4504-8f3c-afa564455537”是我想要获取其对话列表的用户的 ID。
但是,我无法使用实体框架执行它(或者不知道如何)。 有没有办法只使用EF来做到这一点? 我使用 SQLite。
使用 EF 我会像这样写下来,我会分别查询来自和发往用户的消息并将它们适当地分组:
var chatsFromUser = dbContext.Messages
.Where(m => m.From.Id == "f3578a36-208c-4504-8f3c-afa564455537")
.GroupBy(m => m.To.Id);
var chatsToUser = dbContext.Messages
.Where(m => m.To.Id == "f3578a36-208c-4504-8f3c-afa564455537")
.GroupBy(m => m.From.Id);
但是,我还建议您在Message
实体 class 中为用户定义ID
属性:
public class Message
{
public int Id { get; set; }
public IdentityUser From { get; set; }
// choose appropiate type, GUID maybe?
public string FromId { get; set; }
public IdentityUser To { get; set; }
// choose appropiate type, GUID maybe?
public string ToId { get; set; }
public string Text { get; set; }
public DateTime Date { get; set; }
public bool Read { get; set; }
}
然后查询会稍微简化,因为您可以直接从消息 object 访问 ID:
var chatsFromUser = dbContext.Messages
.Where(m => m.FromId == "f3578a36-208c-4504-8f3c-afa564455537")
.GroupBy(m => m.ToId);
var chatsToUser = dbContext.Messages
.Where(m => m.ToId == "f3578a36-208c-4504-8f3c-afa564455537")
.GroupBy(m => m.FromId);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.