关键是你for循环内部的执行速度可能比较慢,就好像你调用200次sql的select,你看看,也不会快,如果你的dt数据量不小的话

解决方案 »

  1.   


    dt数据量是很大,有2w多行,你的意思是因为dt数据量大,linq多次操作导致慢吗。怎么办呢
      

  2.   

    linq不是可以直接select+where么,怎么还做循环,你这样效率不低才怪.
      

  3.   

    就像版主说的那样,你执行SQL语句也该是拼成一个串一次执行某种条件的查询
    而不是做个for循环一次一次的去查.
      

  4.   

    你这种查法完全没发挥出linq的优势来
    跟做两层循环遍历比较有什么本质区别么
      

  5.   

    from item in dt.AsEnumerable()
    where _dtQueryRetGroupId.Contains(item.Field<int>("组号"))
    select item;
    类似如此。
      

  6.   


    我只查了一次sql,然后用linq进一步筛选,linq里面的where就是筛选条件,对于每组筛选结果,还要做进一步处理。你说我不用for循环筛选,你能有什么好办法
      

  7.   

    额,这要求,请直接dt.select 就好,不必用linq另外么你也可以直接把两个dt建立主外关联,如果不会做请google“datatable 关联表建立”
      

  8.   

    哦,原来datatable也能有筛选功能,空了我试试。
    不过我这个需求用建立关联表似乎也没有什么关系呢。
      

  9.   

    for循环里面的代码运行太多次,而且全是无效劳动,需要的结果在哪里.
      

  10.   

        问题已经解决:导致卡的原因是数据量太大导致的,并非linq用得不好,实验中_dtQueryRetGroupId.Length = 200,dt的数据有2w+,所以linq的时间复杂度为平方级别,即使是在内存中做200W+次读取操作也能感知到延迟,实属正常。
        而此处的需求导致了数据量的巨大,这也是没有办法的事情,目前的解决办法是:在第一次获得dt的时候,采用异步委托来完成以上过程,并将结果保存在成员的dataTable中,当真的需要执行以上过程时,直接使用成员中已经处理好的dataTable.也就是说,复杂耗时的计算在其他地方有后台计算,保存,以后要用就直接用缓存值。   综上所述,这其实是一个缓存技术,数据库中有很多记录,我只select一次就筛选出我指定的记录,然后再到内存中继续筛选。当出现了内存中数据依然很庞大的情况时,就再加一层缓存,最后的结果就是:耗时的操作只做一次。
      

  11.   


    我只查了一次sql,然后用linq进一步筛选,linq里面的where就是筛选条件,对于每组筛选结果,还要做进一步处理。你说我不用for循环筛选,你能有什么好办法
    先筛选出所有符合的,然后遍历结果集去进一步处理.
    而不是每次只筛出一个来,筛一个处理一个.