0

Dans un site Web, il y a une page d'article et quand je vais à la page d'article, il affiche l'article et les 10 premiers commentaires appartiennent à cet article.Comment obtenir et sélectionner des données correctes asynchrones à jour

Et il y a un bouton lorsque vous cliquez dessus, il affiche de manière asynchrone le reste de tous les commentaires par AJAX.

La question est que supposer après que la page de l'article est chargé avec les 10 premiers commentaires, l'utilisateur ce propre commentaire ou Admin le supprimer, comment sélectionner le reste des commentaires? Si je saute les 10 premiers commentaires de l'instruction select, certains commentaires ne sont pas sélectionnés.

A titre d'exemple:

suppose que les identifiants commentaires sont: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20

ID 10 premiers commentaires i de sélection sont: 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); 

suppose l'utilisateur que commentaires ou Admin supprimer 2 commentaires dont les ID: 9, 10

puis les premiers t dix commentaires dans la base de données deviendra: 1, 2, 3, 4, 5, 6, 7, 8, 11, 12

lorsque j'essaie d'obtenir le reste des commentaires et ignorer les 10 premiers commentaires, puis le résultat est la suivante: 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); 

donc il y a deux commentaires 11 & 12 Je ne peux pas les voir, parce que les commentaires avec ID: 11, 12 seront considérer la 10 premiers commentaires ...

+1

Alors qu'est-ce qu'on attend ici ... Vous voulez 11,12 à la fois dans l'ensemble, c'est-à-dire les 10 premiers ainsi qu'au repos tous? –

+0

êtes-vous comprendre ma question ??? – mustafa

Répondre

0

Vous devez utiliser Ignorer et prendre ensemble dans la même requête LINQ, et les valeurs transmises à ces fonctions devrait être dynamique en fonction de ce que les données qui ont déjà été présentées dans l'application.

Ainsi, pour l'affichage de la première page, vous auriez une requête comme ceci:

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(); 

Les requêtes suivantes changeraient les valeurs des variables toSkip et toTake de façon appropriée. Idéalement, il s'agirait de paramètres envoyés dans l'action MVC utilisée pour obtenir les données dont l'application a besoin.

Avec cette approche, vous devrez avoir un moyen d'indiquer le nombre de sauts en fonction des données restantes de la liste initiale ou initiale. Une requête LINQ pour obtenir le nombre d'éléments basés sur l'ID de commentaire Min et Max de la liste actuelle devrait vous permettre de dériver le nombre à ignorer. Cette requête prendrait également en compte les données supprimées entre les requêtes. C'est une requête apparemment supplémentaire, donc je ne suis pas très excité à ce sujet.

Vous pouvez utiliser l'ID de commentaire MAX de la liste précédente et filtrer comme ceci.

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(); 

Encore une fois, les valeurs de variables devraient changer en fonction de l'état de l'application en cours; en leur faisant des paramètres d'action étant idéal.Quelque chose comme ceci:

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; 
    } 

Ce n'est pas une solution complète, mais il devrait vous donner une idée de la direction à prendre qui fonctionne le mieux pour votre application. J'espère que ça t'aidera.

+0

Merci, j'ai pensé dans ce avant, mais supposons que Admin supprime l'ID de commentaire = 8 et que je mette max ID = 10, alors l'ID = 8 est maintenant libre, Supposons qu'un autre utilisateur ajoute un nouveau commentaire, , parce que ce numéro est libre maintenant, donc le nouveau commentaire avec ID = 8 ne s'affichera pas – mustafa

+0

Cela me fait penser que vous ne devriez jamais sauter n'importe quoi, et simplement augmenter la prise sur chaque requête suivante, puis repeupler la liste dans l'interface utilisateur complètement chaque temps. –