实施分页频繁更改表数据

时间:2016-01-01 12:36:19

标签: c# asp.net sql-server asp.net-mvc entity-framework

在我的数据库中,表 ChatMessage 哪个有列 标识符,消息,发件人,接收者

现在在我的存储库中,我有获取消息的方法。

public IQueryable<ChatMessage> GetChatMessage(int PageNo, int PageSize, int ownerUserId, int friendUserId)
{
    var query = this.GetQueryable().
        Where(x => (x.Sender.Identifier == ownerUserId && x.Receiver.Identifier == friendUserId) ||
                    (x.Sender.Identifier == friendUserId && x.Receiver.Identifier == ownerUserId));
    query = query.OrderByDescending(x => x.Identifier).Skip((PageNo - 1) * PageSize).Take(PageSize);
    return query;
}

工作正常。但有一个场景:让我打开页面,获取前10条记录,同时OtherUser再向我发送2条消息。

现在,当我点击第二页时,我将收到下一条10条消息,但它将包含2条重复消息(我已经在第一页上了。)

如何避免这种情况?

我希望当我点击第二页时,我想要检索接下来的10条记录,不包括计算这2条新消息。

注意:我不想在会话中存储最后检索的行号,因为这是聊天系统,并且可能有许多用户同时聊天。

我想这样做是因为看到了这种情况。

默认我只加载了最后10条消息。 enter image description here

现在点击 loadmore ,我会在接下来的10封邮件中添加旧li

enter image description here

1 个答案:

答案 0 :(得分:0)

当您发送所有这些参数时,从客户端传递最早消息的时间(不需要页码)。然后在您的存储库中

public IQueryable<ChatMessage> GetChatMessage(int pageSize, int ownerUserId, int friendUserId, DateTime oldestMessageDate)
{
   var query = this.GetQueryable().
              Where(x => ((x.Sender.Identifier == ownerUserId && x.Receiver.Identifier == friendUserId) 
                     || (x.Sender.Identifier == friendUserId && x.Receiver.Identifier == ownerUserId)) 
                     && x.MessageTime < oldestMessageDate); 
    //query now has all the messages older than messages shown to the user

    query = query.OrderByDescending(x => x.Identifier).Take(PageSize);
    return query;
}