Existe-t-il un moyen plus efficace de mettre à jour l’ordre de tri d’une table entière?

asp.net-mvc c# dapper sql-server tsql

Question

J'utilise le tri par glisser-déposer côté client pour une table de données. L'ordre de tri est conservé dans la base de données sous la forme d'un entier simple. Le schéma ressemble à ceci:

Id | Title | SortOrder
1  | A     | 0
2  | B     | 1
3  | C     | 2

Les données peuvent simplement être extraites avec un simple ORDER BY et tout va bien.

Le glisser-déposer côté client que j'ai implémenté enregistre un tableau des ID dans le nouvel ordre, qui est ensuite conservé dans la base de données en utilisant Dapper comme suit (suppression des couches de service pour des raisons de brièveté):

[HttpPost]
public ActionResult UpdateSort(int[] ids)
{
    if (ids != null && ids.Length > 0)
    {
        using (var con = Connection.OpenSql())
        {
            for (var i = 0; i < ids.Length; ++i)
                con.Execute("UPDATE Table SET SortOrder = @sort WHERE Id = @id", new { sort = i, id = ids[i] });
        }
    }
    return new HttpStatusCodeResult(200);
}

Cela fonctionne bien, mais je me demandais s'il y avait un meilleur moyen de gérer la mise à jour en supposant que le côté client ne puisse pas changer . Nous avons une instruction SQL en cours d'exécution par ligne, existe-t-il un moyen de la conserver paramétrée et de la grouper? Est-il possible de supprimer complètement la boucle?

Le nombre d’enregistrements utilisés avec ce code est petit, ce n’est donc pas un problème majeur - la question est vraiment une question de curiosité car je ne pouvais pas imaginer un moyen de commander facilement du SQL avec un tableau arbitraire d’identité. valeurs

J'espère que cette question ne brise pas les règles du site - j'ai eu un chèque et je pense que ça va. Je me rends également compte que la réponse pourrait bien être un «non», mais cela étant, je serais toujours intéressé par la confirmation.

Réponse acceptée

En supposant que les identifiants ne changeront pas, ce sont les options que je pense que vous avez.

Vous trouverez ci-dessous le résumé des modifications dont vous aurez besoin.

  1. Déplacer la mise à jour dans une procédure stockée.
  2. En tant que paramètre du SP, transmettez un XML d'id ou passez un type de table. ( Http://msdn.microsoft.com/en-us/library/bb675163(v=vs.110).aspx ).

  3. Si vous utilisez un fichier xml pour transmettre les valeurs, insérez les entrées XML dans la variable table.Conservez une colonne d'identité ici pour qu'elle devienne éventuellement l'ordre de tri.

  4. Rejoignez la table que vous avez avec la table temporaire avec l'identifiant.

  5. Ecrivez une instruction de mise à jour avec la jointure qui met à jour le champ SortOrder avec les données IdentityColumn.

par exemple

UPDATE Tab
SET SortOrder = [Idnetityfield]
FROM Table Tab
INNER JOIN TempTable Temp ON Temp.id=Tab.id

Je pense que c'est une façon d'aborder votre scénario.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi