0

在一个网站,有一个文章页面,当我去到文章页面,它显示文章和前10条评论属于这篇文章。如何获取和选择真正正确的数据异步更新

点击时有一些按钮,它通过AJAX异步显示所有评论的其余部分。

问题是,假设文章页面加载前10条评论,用户自己的评论或管理员删除它, 如何选择其余的评论? 如果我跳过select语句的前10条评论,还有一些评论未选中。

如实施例:

假设评论ID是: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, 17,18,19,20

首先10点评论的ID我选择是:1,2,3,4,5,6,7,8,9,10

IEnumerable<Comment> comments = (from a in context.Comments 
             where a.ArticleID == ArticleID 
             orderby a.CommentDate descending 
             select new Comment 
             { 
              CommentID = a.CommentID, 
              CommentContent = a.CommentContent, 
              CommentDate = a.CommentDate, 


             }).ToList().Take(10); 

假设用户认为自己的评论或管理删除2评论的编号:9,10

然后冷杉t在数据库中的十条评论将变为:1,2,3,4,5,6,7,8,11,12

当我尝试获得其余评论并跳过前10条评论, 然后结果是:13,14,15,16,17,18,19,20

IEnumerable<Comment> comments = (from a in context.Comments 
             where a.ArticleID == ArticleID 
             orderby a.CommentDate descending 
             select new Comment 
             { 
              CommentID = a.CommentID, 
              CommentContent = a.CommentContent, 
              CommentDate = a.CommentDate, 


             }).ToList().Skip(10); 

所以有两个评论11 & 12我不能看到它们,因为使用标识的评论:11,12将与考虑第10条评论...

+1

所以这里有什么期望...你想要11,12这两个集合,即第一个10以及所有的休息吗? –

+0

你明白我的问题吗? – mustafa

回答

0

您需要使用跳过,并在同一个LINQ查询以一起,并传递给这些函数的值应基于应用程序中已经提供的数据进行动态变化。

因此,对于初始页面显示,你将有一个这样的查询:

var toSkip = 0; var toTake = 10; 

IEnumerable<Comment> comments = (from a in context.Comments 
    where a.ArticleID == ArticleID 
    orderby a.CommentDate descending 
    select new Comment 
    { 
     CommentID = a.CommentID, 
     CommentContent = a.CommentContent, 
     CommentDate = a.CommentDate 
    }) 
    .Skip(toSkip).Take(toTake).ToList(); 

后续查询将在toSkiptoTake变量相应地更改值。 理想情况下,,这些将参数发送到MVC操作,用于获取应用程序所需的数据。

通过这种方法,您将需要有一种方法来根据从之前的或初始列表中留下的数据来告知有多少跳过。根据当前列表中的最小和最大评论ID获取项目数量的LINQ查询应允许您导出要跳过的数字。该查询将考虑到请求之间删除的数据。这是一个看似额外的问题,所以我对此并不那么兴奋。

您可以使用先前列表中的MAX注释ID,并按此过滤。

var toTake = 10; var maxCommentId = 10; 

IEnumerable<Comment> comments = (from a in context.Comments 
    where a.ArticleID == ArticleID 
    && a.CommentID > maxCommentId // <- new filter here 
    orderby a.CommentDate descending 
    select new Comment 
    { 
     CommentID = a.CommentID, 
     CommentContent = a.CommentContent, 
     CommentDate = a.CommentDate 
    }) 
    .Take(toTake).ToList(); 

同样,变量值将需要基于当前应用状态来改变;使他们的行动参数是理想的。事情是这样的:

public async IActionResult GetComments(int articleID, 
    int toSkip = 0, 
    int toTake = 10) 
    { 
     IEnumerable<Comment> comments = (from a in context.Comments 
      where a.ArticleID == articleID 
      orderby a.CommentDate descending 
      select new Comment 
      { 
       CommentID = a.CommentID, 
       CommentContent = a.CommentContent, 
       CommentDate = a.CommentDate 
      }) 
      .Skip(toSkip).Take(toTake).ToList(); 
     return comments; 
    } 

这不是一个完整的解决方案,但它应该给你一个什么样的方向采取最适合您的应用程序的想法。我希望它能帮助你。

+0

谢谢,我以前想过,但是假设Admin删除Comment ID = 8,我设置了max ID = 10,那么ID = 8现在是免费的,假设有另一个用户添加新评论,那么这个新评论可能会说ID = 8 ,因为这个号码现在是免费的,所以ID = 8的新评论将不会出现 – mustafa

+0

这使我认为你永远不应该跳过任何东西,只需增加每个后续查询的Take,然后在UI中完全重新填充列表时间。 –