代码之家  ›  专栏  ›  技术社区  ›  afollestad

ef core-在列表查询结果的会话中包含最新消息

  •  0
  • afollestad  · 技术社区  · 6 年前

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

    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 将映射到 Conversation ConversationId 外键。


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

    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 在检索到初始结果之后,因为这将全部存在于许多对话的列表中。

    谢谢!

    1 回复  |  直到 6 年前
        1
  •  1
  •   David Browne - Microsoft    6 年前

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