J'ai eu du mal avec la pagination récemment. Je me souviens que j'avais déjà publié une méthode pour modifier la pagination DW ASP, et que j'avais ensuite écrit une pagination ASP manuelle. Maintenant que j'entre dans .NET, je dois bien s?r coopérer avec. procédures stockées pour créer une pagination haute performance purement manuelle.
Pourquoi est-ce appelé haute performance ? Pourquoi doit-il être construit manuellement au lieu d'utiliser les contr?les de pagination existants de .NET ? Cela remonte à l'époque où j'ai modifié DW ASP?? la pagination, et je ne connaissais pas grand-chose en programmation à cette époque. Je sais seulement comment résoudre les problèmes, et encore moins parler des problèmes de performances. J'étais très contrarié à l'époque, alors j'ai demandé à mon directeur technique personnel, M. Zhang, pour m'aider à jeter un ?il. à ce moment-là, M. Zhang m'a regardé avec un regard dédaigneux et a dit : Est-ce que ?a vaut le coup
Ensuite, j'ai créé une pagination ASP à la main et je n'ai pas pu le faire. M. Zhang m'a lancé un tas de code .NET : étudiez-le vous-même. Puis il a ajouté une autre phrase Mots : Utilisez .NET pour le faire, vous pouvez le faire en quelques mots, ne vous embêtez pas avec ?a. ??>
Plus tard, j'ai découvert que le processus de pagination précédent consistait à lire l'intégralité de l'ensemble de données, puis à effectuer le processus de pagination. Une fois que la quantité de données est trop importante, le traitement sera très lent, voire le serveur plantera. . Ensuite, la pagination précédente ne peut pas défiler comme un curseur, elle est toujours fixe dans un groupe, et il est impossible d'obtenir l'effet du numéro de page actuel au milieu
Parlons-en ensuite. contr?le de pagination, il peut en effet être résolu en quelques mots, mais le défaut est le premier problème que j'ai trouvé, à savoir qu'il est inefficace de lire toutes les données puis de les traiter, j'ai donc finalement commencé à construire ASP.NET uniquement en hand. Pagination haute performance.
La première est la procédure stockée, qui ne supprime que les données dont j'ai besoin, si le nombre de pages dépasse le nombre total de données, elle renvoie automatiquement l'enregistrement de la dernière page?:
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Clear -- Create date: 2007-01-30 -- Description: 高性能分頁(yè) -- ============================================= Alter PROCEDURE [dbo].[Tag_Page_Name_Select] -- 傳入最大顯示紀(jì)錄數(shù)和當(dāng)前頁(yè)碼 @MaxPageSize int, @PageNum int, -- 設(shè)置一個(gè)輸出參數(shù)返回總紀(jì)錄數(shù)供分頁(yè)列表使用 @Count int output AS BEGIN SET NOCOUNT ON; DECLARE -- 定義排序名稱參數(shù) @Name nvarchar(50), -- 定義游標(biāo)位置 @Cursor int -- 首先得到紀(jì)錄總數(shù) Select @Count = count(tag_Name) FROM [viewdatabase0716].[dbo].[view_tag]; -- 定義游標(biāo)需要開始的位置 Set @Cursor = @MaxPageSize*(@PageNum-1)+1 -- 如果游標(biāo)大于紀(jì)錄總數(shù)將游標(biāo)放到最后一頁(yè)開始的位置 IF @Cursor > @Count BEGIN -- 如果最后一頁(yè)與最大每次紀(jì)錄數(shù)相等,返回最后整頁(yè) IF @Count % @MaxPageSize = 0 Set @Cursor = @Count - @MaxPageSize + 1 -- 否則返回最后一頁(yè)剩下的紀(jì)錄 ELSE Set @Cursor = @Count - (@Count % @MaxPageSize) + 1 END -- 將指針指到該頁(yè)開始 Set Rowcount @Cursor -- 得到紀(jì)錄開始的位置 Select @Name = tag_Name FROM [viewdatabase0716].[dbo].[view_tag] orDER BY tag_Name; -- 設(shè)置開始位置 Set Rowcount @MaxPageSize -- 得到該頁(yè)紀(jì)錄 Select * From [viewdatabase0716].[dbo].[view_tag] Where tag_Name >= @Name order By tag_Name Set Rowcount 0 ENDEnsuite Contr?le de pagination (... est la méthode omise de génération de code HTML) :
using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Text; /// <summary> /// 擴(kuò)展連接字符串 /// </summary> public class ExStringBuilder { private StringBuilder InsertString; private StringBuilder PageString; private int PrivatePageNum = 1; private int PrivateMaxPageSize = 25; private int PrivateMaxPages = 10; private int PrivateCount; private int PrivateAllPage; public ExStringBuilder() { InsertString = new StringBuilder(""); } /// <summary> /// 得到生成的HTML /// </summary> public string GetHtml { get { return InsertString.ToString(); } } /// <summary> /// 得到生成的分頁(yè)HTML /// </summary> public string GetPageHtml { get { return PageString.ToString(); } } /// <summary> /// 設(shè)置或獲取目前頁(yè)數(shù) /// </summary> public int PageNum { get { return PrivatePageNum; } set { if (value >= 1) { PrivatePageNum = value; } } } /// <summary> /// 設(shè)置或獲取最大分頁(yè)數(shù) /// </summary> public int MaxPageSize { get { return PrivateMaxPageSize; } set { if (value >= 1) { PrivateMaxPageSize = value; } } } /// <summary> /// 設(shè)置或獲取每次顯示最大頁(yè)數(shù) /// </summary> public int MaxPages { get { return PrivateMaxPages; } set { PrivateMaxPages = value; } } /// <summary> /// 設(shè)置或獲取數(shù)據(jù)總數(shù) /// </summary> public int DateCount { get { return PrivateCount; } set { PrivateCount = value; } } /// <summary> /// 獲取數(shù)據(jù)總頁(yè)數(shù) /// </summary> public int AllPage { get { return PrivateAllPage; } } /// <summary> /// 初始化分頁(yè) /// </summary> public void Pagination() { PageString = new StringBuilder(""); //得到總頁(yè)數(shù) PrivateAllPage = (int)Math.Ceiling((decimal)PrivateCount / (decimal)PrivateMaxPageSize); //防止上標(biāo)或下標(biāo)越界 if (PrivatePageNum > PrivateAllPage) { PrivatePageNum = PrivateAllPage; } //滾動(dòng)游標(biāo)分頁(yè)方式 int LeftRange, RightRange, LeftStart, RightEnd; LeftRange = (PrivateMaxPages + 1) / 2-1; RightRange = (PrivateMaxPages + 1) / 2; if (PrivateMaxPages >= PrivateAllPage) { LeftStart = 1; RightEnd = PrivateAllPage; } else { if (PrivatePageNum <= LeftRange) { LeftStart = 1; RightEnd = LeftStart + PrivateMaxPages - 1; } else if (PrivateAllPage - PrivatePageNum < RightRange) { RightEnd = PrivateAllPage; LeftStart = RightEnd - PrivateMaxPages + 1; } else { LeftStart = PrivatePageNum - LeftRange; RightEnd = PrivatePageNum + RightRange; } } //生成頁(yè)碼列表統(tǒng)計(jì) PageString.Append(...); StringBuilder PreviousString = new StringBuilder(""); //如果在第一頁(yè) if (PrivatePageNum > 1) { ... } else { ... } //如果在第一組分頁(yè) if (PrivatePageNum > PrivateMaxPages) { ... } else { ... } PageString.Append(PreviousString); //生成中間頁(yè) for (int i = LeftStart; i <= RightEnd; i++) { //為當(dāng)前頁(yè)時(shí) if (i == PrivatePageNum) { ... } else { ... } } StringBuilder LastString = new StringBuilder(""); //如果在最后一頁(yè) if (PrivatePageNum < PrivateAllPage) { ... } else { ... } //如果在最后一組 if ((PrivatePageNum + PrivateMaxPages) < PrivateAllPage) { ... } else { ... } PageString.Append(LastString); } /// <summary> /// 生成Tag分類表格 /// </summary> public void TagTable(ExDataRow myExDataRow) { InsertString.Append(...); }Méthode d'appel :
//得到分頁(yè)設(shè)置并放入Session ExRequest myExRequest = new ExRequest(); myExRequest.PageSession("Tag_", new string[] { "page", "size" }); //生成Tag分頁(yè) ExStringBuilder Tag = new ExStringBuilder(); //設(shè)置每次顯示多少條紀(jì)錄 Tag.MaxPageSize = Convert.ToInt32(Session["Tag_size"]); //設(shè)置最多顯示多少頁(yè)碼 Tag.MaxPages = 9; //設(shè)置當(dāng)前為第幾頁(yè) Tag.PageNum = Convert.ToInt32(Session["Tag_page"]); string[][] myNamenValue = new string[2][]{ new string[]{"MaxPageSize","PageNum","Count"}, new string[]{Tag.MaxPageSize.ToString(),Tag.PageNum.ToString()} }; //調(diào)用存儲(chǔ)過(guò)程 DataTable myDataTable = mySQL.BatchGetDB("Tag_Page_Name_Select", myNamenValue, "Count"); Tag.DateCount = (int)mySQL.OutputCommand.Parameters["@Count"].Value; Tag.Pagination(); HeadPage.InnerHtml = FootPage.InnerHtml = Tag.GetPageHtml; for (int i = 0, j = myDataTable.Rows.Count; i < j; i++) { Tag.TagTable(new ExDataRow(myDataTable.Rows[i])); } TagBox.InnerHtml = Tag.GetHtml;La méthode de le traitement des numéros de page vers Session n'est pas fourni et ce n'est pas très gros. La méthode d'appel de la procédure stockée pour renvoyer les paramètres et les enregistrements est similaire à la méthode d'opération de données par lots que j'ai écrite auparavant. .
à l'heure actuelle, je pense qu'il y aura des défauts dans ces codes, j'attendrai le code ultérieur du projet pour le renforcer lors de la révision. Ce que je veux dire, c'est de ne pas être dérouté par ceux-ci. des choses qui tra?nent. Cela ne vous améliorera jamais. Faites quelque chose avec l'attitude de savoir ce qui se passe et pourquoi, l'aide pour vous-même sera évidente

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

CustomAttributes sont des mécanismes utilisés dans C # pour attacher des métadonnées aux éléments de code. Sa fonction principale consiste à hériter de la classe System.Attribute et à lire la réflexion à l'exécution pour implémenter des fonctions telles que la journalisation, le contr?le de l'autorisation, etc. spécifiquement, il comprend: 1. CustomAttributes sont des informations déclaratives, qui existent sous forme de classes de fonctionnalités, et sont souvent utilisées pour marquer des classes, des méthodes, etc.; 2. Lors de la création, vous devez définir une classe héritée de l'attribut et utiliser AttributUsage pour spécifier la cible d'application; 3. Après l'application, vous pouvez obtenir des informations sur les fonctionnalités via la réflexion, telles que l'utilisation d'attribut.getCustomAttribute ();

Le c?ur de la conception d'objets immuables et de structures de données en C # est de s'assurer que l'état de l'objet n'est pas modifié après la création, améliorant ainsi la sécurité des threads et la réduction des bogues causés par les changements d'état. 1. Utilisez des champs en lecture et coopérez avec l'initialisation du constructeur pour vous assurer que les champs ne sont attribués que pendant la construction, comme indiqué dans la classe de personne; 2. Encapsulez le type de collection, utilisez des interfaces de collecte immuables telles que ReadOnlyCollection ou Immutablelist pour empêcher une modification externe des collections internes; 3. Utilisez l'enregistrement pour simplifier la définition du modèle immuable et générer des attributs en lecture seule et des constructeurs par défaut, adaptés à la modélisation des données; 4. Il est recommandé d'utiliser System.Collections.imm lors de la création d'opérations de collecte immuables.

La clé de la rédaction du code C # est la maintenabilité et la testabilité. Diviser raisonnablement les responsabilités, suivre le principe de responsabilité unique (SRP) et prendre respectivement l'accès aux données, la logique métier et le traitement des demandes par le référentiel, le service et le contr?leur pour améliorer la clarté structurelle et l'efficacité des tests. L'interface polyvalente et l'injection de dépendance (DI) facilitent la mise en ?uvre du remplacement, l'extension des fonctions et les tests de simulation. Les tests unitaires doivent isoler les dépendances externes et utiliser des outils simulés pour vérifier la logique pour assurer une exécution rapide et stable. Standardiser la dénomination et la division de petites fonctions pour améliorer la lisibilité et l'efficacité de maintenance. L'adhésion aux principes de la structure claire, des responsabilités claires et des tests peut améliorer considérablement l'efficacité du développement et la qualité du code.

Créez un middleware personnalisé dans ASP.Netcore, qui peut être implémenté en écrivant des classes et en s'inscrivant. 1. Créez une classe contenant la méthode invokeaSync, gérez httpContext et requestdelegateNext; 2. Inscrivez-vous avec Usemiddleware dans Program.cs. Le middleware convient aux opérations générales telles que la journalisation, la surveillance des performances, la gestion des exceptions, etc. Contrairement aux filtres MVC, il agit sur l'ensemble de l'application et ne s'appuie pas sur le contr?leur. L'utilisation rationnelle du middleware peut améliorer la flexibilité structurelle, mais devrait éviter d'affecter les performances.

Des contraintes génériques sont utilisées pour restreindre les paramètres de type pour assurer un comportement spécifique ou des relations d'héritage, tandis que la covariation permet la conversion du sous-type. Par exemple, où: ICOMPARABLE garantit que t est comparable; La covariation telle que IEnumerable permet à IEnumerable d'être convertie en IEnumerable, mais elle n'est lue et ne peut pas être modifiée. Les contraintes courantes incluent la classe, la structure, new (), la classe de base et l'interface, et plusieurs contraintes sont séparées par des virgules; La covariation nécessite le mot-clé OUT et ne s'applique qu'aux interfaces et délégués, ce qui est différent de l'onduleur (en mot-clé). Notez que la covariance ne prend pas en charge les classes, ne peut pas être convertie à volonté et que les contraintes affectent la flexibilité.

Les points suivants doivent être suivis lors de l'utilisation de LINQ: 1. La priorité est donnée à LINQ lors de l'utilisation des opérations de données déclaratives telles que le filtrage, la conversion ou l'agrégation des données pour éviter une utilisation forcée dans des scénarios avec des effets secondaires ou des scénarios critiques de performance; 2. Comprendre les caractéristiques de l'exécution retardée, les modifications de l'ensemble de source peuvent conduire à des résultats inattendus, et les retards ou l'exécution doivent être sélectionnés en fonction des exigences; 3. Faites attention aux frais généraux de performances et de mémoire, les appels de cha?ne peuvent générer des objets intermédiaires et les codes sensibles aux performances peuvent être remplacés par des boucles ou des portées; 4. Gardez la requête concise et facile à lire, et divisez la logique complexe en plusieurs étapes pour éviter une nidification excessive et un mélange de plusieurs opérations.

Les problèmes communs avec asynchronisation et attendre en C # incluent: 1. Utilisation incorrecte de .Result ou .Wait () provoque une impasse; 2. Ignorer ConfigureAwait (False) provoque des dépendances contextuelles; 3. L'abus d'AsyncVoid provoque un contr?le manquant; 4. L'attente en série affecte les performances de la concurrence. La bonne fa?on est: 1. La méthode asynchrone doit être asynchrone tout le chemin pour éviter le blocage de la synchronisation; 2. L'utilisation de ConfigureAwait (false) dans la bibliothèque de classe est utilisée pour s'écarter du contexte; 3. Utiliser uniquement AsyncVoid dans le traitement des événements; 4. Les taches simultanées doivent d'abord être démarrées, puis attendre pour améliorer l'efficacité. Comprendre le mécanisme et normaliser l'utilisation du code asynchrone qui évite d'écrire un blocage substantiel.

L'interface Fluent est une méthode de conception qui améliore la lisibilité du code et l'expressivité à travers les appels de cha?ne. Le noyau est que chaque méthode renvoie l'objet actuel, afin que plusieurs opérations puissent être appelées en continu, comme Varresult = NewstringBuilder (). APPEND ("Hello"). Ajouter (""). Lors de la mise en ?uvre, vous devez combiner la méthode d'extension et le modèle de conception qui le renvoie, tels que la définition de la classe CluentString et le renvoi dans sa méthode, et la création d'une instance initiale via la méthode d'extension. Les scénarios d'application courants incluent la création de configurateurs (tels que les règles de vérification), la vérification
