假设有一个类似于这样的实体结构:
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; }
}
是否可以用该对话的最新消息填充LastMessage
?Message
将使用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)};