2014-01-19 45 views
1

A Chat具有Messages。鑑於MessageId,我試圖得到接下來的50條消息。我現在所擁有的應該是理論上的工作,但是因爲我將所有內容都加載到內存中,所以效率很低。這是我到目前爲止:EF - 在排序後的查詢中的特定元素之後提取X個元素

  // get message with parent chat/other messages 
      var message = db.ChatMessages.Include(s => s.Chat.Messages).First(s => s.ChatMessageId == messageId); 
      var chat = message.Chat; 

      // this is what I want to avoid, but I don't know how to get the position without throwing all messages into memory 
      var messages = chat.Messages.OrderByDescending(s => s.DatePosted).ToList(); 
      var index = messages.IndexOf(message); 
      messages = messages.GetRange(index, index + 50); 
      return messages.ToList(); 

如何執行此操作而不會將每條消息都扔到內存中?

回答

1

如果你得到最後一條消息的ID(或其他唯一的),這會變得更簡單。假設ID始終遞增......

var messages = chat.Messages. 
        Where(s=>s.Id > LastMessage.Id). 
        OrderByDescending(s => s.DatePosted). 
        Take(50); 

如果你沒有總是遞增的ID ...

var messages = chat.Messages. 
        Where(s=>s.DatePosted > LastMessage.DatePosted). 
        OrderByDescending(s => s.DatePosted). 
        Take(50); 
return messages.ToList(); 
+0

我試圖避免這是ToList():'VAR消息= chat.Messages.OrderByDescending(s => s.DatePosted).ToList();' - 或者它是不可避免的? – SB2055

+0

看我的編輯 - 我認爲這有幫助嗎?對不起,是的,我撇開了這個問題,並補充說,當它是你的問題的主旨時作爲事後的想法。道歉 – Basic

+1

啊,基於id是一個聰明的解決方案。我認爲它的作品!我會盡快接受。 – SB2055

相關問題