zoukankan      html  css  js  c++  java
  • ASP.NET 无级限分类个人见解


        最近正在做一套信息发布系统,允许无限级城市,无级限分类,客户自定义字段,显示列表自定义等功能.查阅了相关资料这套系统快要完工了,但发现效率不是很高.之前我习惯把数据一次性读出来装入缓存,然后像无限级的东西,在类中读取缓存关系再读出来,结果发现在无限级数据不是很多的情况下,第一次装入的速度还可以,后来越发越觉得慢,参阅了一些资料,优化方面.

    例如:ASP.NET无限级分类的非递归实现(存储过程版)
    http://hi.baidu.com/webrecord/blog/item/194031081bad8dd062d986f2.html

    这个方法还可以,只不过在存入的时候麻烦,读取了出来还是蛮快的.如果我需要根据自定义排序,在加上一些其它条件估计得写上N多代码.

    以下是我的方法.

    1.存入的时候还是按普通方法存入
    2.创建存储过程,主要是用来读数据的

    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    GO
    CREATE PROCEDURE [dbo].[City_GetListInfo] (@pid int)
    AS
    BEGIN
     SET NOCOUNT ON
     DECLARE @level int, @line char(20)
     CREATE TABLE #city (cityid int, level int,[id] [int] IDENTITY(1,1) NOT NULL,)
     CREATE TABLE #c (item int, level int)
     INSERT INTO #c VALUES (@pid, 1)
     SELECT @level = 1

     WHILE @level > 0
     BEGIN
       IF EXISTS (SELECT * FROM #c WHERE level = @level)
      BEGIN
        SELECT @pid = item
        FROM #c
        WHERE level = @level
        INSERT INTO #city VALUES (@pid, @level)
        DELETE FROM #c
        WHERE level = @level
       AND item = @pid
        INSERT #c
       SELECT cityid, @level + 1
       FROM [城市表]
       WHERE citypid = @pid order by citysort asc,cityname asc
        IF @@ROWCOUNT > 0
       SELECT @level = @level + 1
      END
       ELSE
      SELECT @level = @level - 1
     END

     select a.CityId,a.CityName, CASE WHEN a.CityDomain IS NULL THEN '' ELSE a.CityDomain END AS CityDomain,a.CityPId,a.CitySort, CASE WHEN a.CitySys IS NULL THEN 'false' ELSE a.CitySys END AS CitySys,b.level
     from #city b, [城市表] a where a.cityid=b.cityid order by b.id asc

    END
    这个主要是读出的时候自动排好顺序.

    3.创建另一张表,结构和现有表一模一样,我现在用是的城市表,就创建城市优化表
    4.创建存储过程

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

    CREATE PROCEDURE [dbo].[City_OptimizeUpdate]
     -- Add the parameters for the stored procedure here
    AS
    BEGIN

     truncate   table   [城市优化表]
     INSERT INTO [t_sys_optimize_city]
     EXEC [dbo].[City_GetListInfo]
       @pid = 0
    END


    这个将结果永久存入城市优化表,但是这样还是不能自动更新,需要借助触发器


    5给[城市表]增加触发器

    CREATE TRIGGER [dbo].[Trigger_城市表]
       ON  [dbo].[城市表]
       for update,insert,delete
    AS
    BEGIN

       SET NOCOUNT ON;

        EXEC [dbo].[City_OptimizeUpdate]

    6.以后读取就直接读取[城市优化表]

  • 相关阅读:
    递归删除指定目录下的 .git 文件
    mina 字节数组编解码器的写法 I
    爬取大众点评
    使用Scrapy抓取数据
    Redis:默认配置文件redis.conf详解
    Redis:五种数据类型的简单增删改查
    使用python-docx生成Word文档
    IT部门域事件与业务分析
    因为说比做容易,所以要少说慎说
    主要问题
  • 原文地址:https://www.cnblogs.com/hubj/p/1241760.html
Copyright © 2011-2022 走看看