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.以后读取就直接读取[城市优化表]

原文地址:https://www.cnblogs.com/hubj/p/1241760.html