Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在频繁更改的表数据上实现分页_C#_Asp.net_Sql Server_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# 在频繁更改的表数据上实现分页

C# 在频繁更改的表数据上实现分页,c#,asp.net,sql-server,asp.net-mvc,entity-framework,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.Identi

在我的数据库中,表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;
}
public IQueryable GetChatMessage(int-PageNo、int-PageSize、int-ownerUserId、int-friendUserId)
{
var query=this.GetQueryable()。
其中(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);
返回查询;
}
它工作得很好。但有一个场景:让我打开页面,获取前10条记录,同时其他用户再向我发送2条消息

现在,当我点击第二页时,我将得到接下来的10条消息,但它将包括2条重复的消息(我已经在第一页上看到了)

如何避免这种情况

当我点击第二页时,我想检索下10条记录,不包括这2条新消息

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

我想这样做是因为情况就是这样

默认情况下,我只加载了最后10条消息。

现在单击“加载更多”,我将为旧的
li


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

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;
}
public IQueryable GetChatMessage(int-pageSize、int-ownerUserId、int-friendUserId、DateTime-oldestMessageDate)
{
var query=this.GetQueryable()。
其中(x=>((x.Sender.Identifier==ownerUserId&&x.Receiver.Identifier==friendUserId)
||(x.Sender.Identifier==friendUserId&&x.Receiver.Identifier==ownerUserId))
&&x.MessageTimex.Identifier).Take(PageSize);
返回查询;
}

因为我在同一个
li
页面上预发下一条信息,从而在同一页面上显示所有聊天信息。就像fb一样,在检索旧消息时,它只是将旧消息预先发送到messagebox。为什么要向下投票。请解释获取上一页最旧邮件的ID。然后,在附加当前页面之前,筛选并附加ID早于该ID的邮件。或者,如果您希望在下一页中精确显示10条邮件,您可以将上一页中最早的邮件的时间作为参数传递,并在存储库中选择10条早于该时间的邮件。您可以说“我不想在会话中存储最后一个检索行号,因为这是聊天系统,可能有许多用户同时聊天。“这对我来说毫无意义。首先,您可以而且可能应该将其存储在客户机上,而不是服务器上。其次,如果有许多用户同时聊天,那么每个用户都会发送许多消息。每次会话记住一个id会如何突然扼杀可伸缩性?我应该在哪里为不同的用户存储这个datetime变量。另请看我对另一个答案的评论。这是使用ChatJs实现的吗?否。这只是一个span标记(加载更多),我在该span上编写了click事件来加载以前的记录。使用UserId和DateTime属性创建一个数组clientside,并将其保存在SessionStorage/LocalStorage中。每次获得聊天信息数组时,根据用户ID添加/更新最早的日期时间。确定。哪一个更适合cookie或浏览器本地存储。