EF Core - 在列表查询结果中包含对话中的最新消息



假设有一个类似于这样的实体结构:

class Conversation
{
[Key]
public long Id { get; set; }
public long CreatorId { get; set; }
public long RecipientId { get; set; }
public IQueryable<Message> Messages { get; set; }
// Populate this with the most recent sent/received message:
public Message LastMessage { get; set; }
}
class Message
{
[Key]
public long Id { get; set; } 
public long SenderId { get; set; }
public string Body { get; set; }
[ForeignKey("Conversation")]
public long ConversationId { get; set; }
public Conversation Conversation { get; set; }
}

是否可以用该对话的最新消息填充LastMessageMessage将使用ConversationId外键映射到它们的Conversation


如果这是不可能的,那么使用类似的对话实体是否可能?

class Conversation
{
[Key]
public long Id { get; set; }
public long CreatorId { get; set; }
public long RecipientId { get; set; }
[ForeignKey("ConversationId")]
public IQueryable<Message> Messages { get; set; }
// Populate these fields with the respective values from the most recent message:
public long LastMessageSenderId { get; set; }
public string LastMessageBody { get; set; }
}

这里的主要内容是将所有这些结果包含在单个SELECT查询中,并且在检索初始结果后不必访问Messages,因为这都存在于许多对话的列表中。

谢谢!

通常,对话实体上不会有 LastMessage,只需根据需要查询它。 像这样:

var q = from c in db.Conversations 
select new {Conversation=c, LastMessage = c.Messages.OrderByDescending(m => m.Id).Take(1)};

最新更新