SearchUserTT方法,去数据库中用存储过程查询用户表,返回DataTable并且缓存起来,下次再取的时候如果有缓存就取缓存。        public DataTable SearchUserTT(int customerid, int exceptionid, bool islimit)
        {            DataTable dtCache = new DataTable();            if (HttpContext.Current.Cache["dtSearchUserName"] != null)
            {
                dtCache = (DataTable)HttpContext.Current.Cache["dtSearchUserName"];
                return dtCache;
            }
            else
            {
                SqlConnection con = new SqlConnection(ConfigurationSettings.AppSettings["learnways_main_dsn"]);
                SqlCommand com = new SqlCommand("DL_UserSearch", con);
                com.CommandType = CommandType.StoredProcedure;
                com.Parameters.Add("@customerid", SqlDbType.Int).Value = customerid;
                com.Parameters.Add("@exceptionid", SqlDbType.Int).Value = exceptionid;
                com.Parameters.Add("@islimit", SqlDbType.Bit).Value = islimit;
                SqlDataAdapter sda = new SqlDataAdapter(com);
     
                sda.Fill(dtCache);                HttpContext.Current.Cache.Insert("dtSearchUserName", dtCache, null, DateTime.Now.AddMinutes(60), TimeSpan.Zero);                sda.Dispose();
                com.Dispose();
                con.Close();                return dtCache;            }
        }在这里来进行操作, 用DataView.RowFilter 属性来进行筛选。  取符合条件的前十条记录。        [AjaxMethod()]
        public string SearchUser(string value)
        {
            StringBuilder sb = new StringBuilder();
            int customerid = ((User)(HttpContext.Current.Session["User"])).CustomerId;
            value = "%" + value.Trim() + "%";
            string dvQuerystr = "strFirstname LIKE '" + value + "' OR strLastname LIKE '" + value
                + "' OR strFirstname+strLastname LIKE '" + value
                + "' OR strFirstname+' '+strLastname LIKE '" + value + "'";            DataView dv = new DataView(SearchUserTT(customerid, 0, true));
            dv.RowFilter = dvQuerystr;            int top = 10;
            if (dv.Count <= 10 )
            {
                top = dv.Count;
            }
            for (int i = 0; i < top; i++)
            {
                sb.Append("<div onmouseout='RollOut(this)' onmouseover='RollOver(this)' class='lw__searchRes' id='" + dv[i].Row["intuserid"] + "' onClick='ChooseItem(this, " + dv[i].Row["intuserid"] + ")'>" + dv[i].Row["strfirstname"] + " " + dv[i].Row["strlastname"] + " " + dv[i].Row["stremail"] + "</div>");
            }            dv.Dispose();
            return sb.ToString();
        }  
我现在的应用是:
         在一个文本框里输入一个人的姓名,每输入一个字母就去选出符合条件的前十条。
         比如我叫Fredrik,输入F查找显示在下面,再输入r就查找Fr,再输e就查找Fre。
现在我提出的问题是:
         
         缓存起来的DataTable中数据有五万条,每次通过DataView.RowFilter去筛选都是新建的一个DataTable,
         速度上比较慢,希望听听大家的想法,看有没有更好的实现方式。比如百度  谷歌,输入几个关键字查询出来会非常快。 希望大家说说自己的看法,贴一下代码。

解决方案 »

  1.   

    一个datatable  好像只能使用dataview进行查询 过滤
    不知道还有没有别的方法。。
    你想百度谷歌? 楼主 别想 你想不出来
      

  2.   

    这个效果得用AJAX来做,你这样做确实太慢
      

  3.   

    把datatable分拆吧,可以按26个字母拆开后在cache
      

  4.   

    试试LINQ,不是有Linq for object么,对应内存中的数据对象的.
    看看它的查询速度是不是快一点.
      

  5.   

    我对AJAX是比较感冒的,兄台如果有思路,有心情,和你学一手。
      

  6.   


    asp.net2.0里暂时还没有出来LINQ,应该用不了。
      

  7.   

    好久以前是那么搞的,先把F开的找出来,存下。。
    然后如果是FE,那么把不是FE的全删了。。存下如此如此,这般这般。存当然可是是缓存,也可是其它的方式!不过,现在jQuery有个插件了,
    基本上去他了,漂亮又开发速度快!
      

  8.   

    加快查询速度为什么不用HashTable、Dictionary??
      

  9.   

    搞开发的同事也建议我用Dictionary,不过我没写过,初级程序员吗,呵呵。
      

  10.   

    正是因为每次要去查询数据库,速度比较慢,所以才建立缓存来提高速度。
              现在就是觉得建立了缓存后,用RowFilter来筛选,效果不好。
                 大家有什么思路没有,诚心学习。
      

  11.   

    一般都是用dv。rowfilter
    dt。select()
      

  12.   

    改变你的数据模式吧,查询出来的时候把DataTable换种数据结构,
    试试B-tree。至于Ajax效果,楼主搜搜googleSuggest的JQuery插件,我用过很好用的,
    而且那个插件可以进行客户端的缓存,减轻服务器压力。
      

  13.   

    赞同这样的做法用AJAX来实现。
      

  14.   

    虽然说这个观点让我小小的思考了一下,不过回想一下,把DataTable换一种数据存储结构。但是换了存储结构后,再去实现DV.RowFilter筛选,似乎就不可行了,对不对。
    还是尝试一下那个插件的效果吧,做客户端缓存,不太必要,因为这种筛选每次都要去服务端执行筛选代码,再返回结果。
      

  15.   

    查询速度靠索引DataView RowFilter 效率在大数据量下, 慢的恐怖可以自己建立索引, 可以使用 hashtable,在创建 DataTable 的时候, 一次创建, 多次受益.
      

  16.   

    如果滥用缓存,还不如不用缓存。缓存用在实际的操作上,例如(用你的代码):
    [AjaxMethod()]
    public string SearchUser(string value)
    {
        value = "%" + value.Trim() + "%";
        string dvQuerystr = "strFirstname LIKE '" + value + "' OR strLastname LIKE '" + value
            + "' OR strFirstname+strLastname LIKE '" + value
            + "' OR strFirstname+' '+strLastname LIKE '" + value + "'";
        int customerid = ((User)(HttpContext.Current.Session["User"])).CustomerId;
        var key=string.Format("query is {0}, customerid is {1}",dvQuerystr,customerid);
        var cache=HttpContext.Cache;
        StringBuilder sb =cache[key];
        if(sb==null)
        {
            sb= 去查什么DataView之类的随便什么算法(customerid, dvQuerystr);
            cache.Insert(key, sb, null,   //其实null写为SqlDependency或者自定义的数据库依赖项对象才准确
                 DateTime.Now.AddMinutes(60), TimeSpan.Zero);
        }
        return sb.ToString();
    }
    Cache应该放在高层次BLL层。如果搁在底层,肯定容易滥用,甚至想出一次读取几万条记录这么简单恐怖的做法。
      

  17.   

    缓存起来的DataTable中数据有五万条?个人觉得这个存的太多了,还不如就直接读取数据库呢!
      

  18.   


    你这样还不如直接去查数据库我想 你所理解的缓存应该是把数据库里的东西搬到内存里用RowFilter来筛选 不是与数据库查一样么?如果数据少内存会很快,数据一多 不仅内存不够用导致服务器崩溃,而且查的速度很慢(RowFilter 相当于是在内存表中进行where语句)缓存是什么?就是把经常查询到的,不易更新的数据放到内存里你那5W条记录是要经常查询显示的?想想看?
    真正要查询显示的是多少?
    存了多少垃圾在内存里?