该linq效率太低,是我写的不好吗? 关键是你for循环内部的执行速度可能比较慢,就好像你调用200次sql的select,你看看,也不会快,如果你的dt数据量不小的话 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 dt数据量是很大,有2w多行,你的意思是因为dt数据量大,linq多次操作导致慢吗。怎么办呢 linq不是可以直接select+where么,怎么还做循环,你这样效率不低才怪. 就像版主说的那样,你执行SQL语句也该是拼成一个串一次执行某种条件的查询而不是做个for循环一次一次的去查. 你这种查法完全没发挥出linq的优势来跟做两层循环遍历比较有什么本质区别么 from item in dt.AsEnumerable()where _dtQueryRetGroupId.Contains(item.Field<int>("组号"))select item;类似如此。 我只查了一次sql,然后用linq进一步筛选,linq里面的where就是筛选条件,对于每组筛选结果,还要做进一步处理。你说我不用for循环筛选,你能有什么好办法 额,这要求,请直接dt.select 就好,不必用linq另外么你也可以直接把两个dt建立主外关联,如果不会做请google“datatable 关联表建立” 哦,原来datatable也能有筛选功能,空了我试试。不过我这个需求用建立关联表似乎也没有什么关系呢。 for循环里面的代码运行太多次,而且全是无效劳动,需要的结果在哪里. 问题已经解决:导致卡的原因是数据量太大导致的,并非linq用得不好,实验中_dtQueryRetGroupId.Length = 200,dt的数据有2w+,所以linq的时间复杂度为平方级别,即使是在内存中做200W+次读取操作也能感知到延迟,实属正常。 而此处的需求导致了数据量的巨大,这也是没有办法的事情,目前的解决办法是:在第一次获得dt的时候,采用异步委托来完成以上过程,并将结果保存在成员的dataTable中,当真的需要执行以上过程时,直接使用成员中已经处理好的dataTable.也就是说,复杂耗时的计算在其他地方有后台计算,保存,以后要用就直接用缓存值。 综上所述,这其实是一个缓存技术,数据库中有很多记录,我只select一次就筛选出我指定的记录,然后再到内存中继续筛选。当出现了内存中数据依然很庞大的情况时,就再加一层缓存,最后的结果就是:耗时的操作只做一次。 我只查了一次sql,然后用linq进一步筛选,linq里面的where就是筛选条件,对于每组筛选结果,还要做进一步处理。你说我不用for循环筛选,你能有什么好办法先筛选出所有符合的,然后遍历结果集去进一步处理.而不是每次只筛出一个来,筛一个处理一个. 调试C#时,遇到问题。 C#如何将datagridview导出为dbf表? 帮忙看看是什么问题。 知道一个窗口的句柄,如何获得该窗口的进程ID 问一个关于修改表结构的问题,而又不希望破坏表里的记录. 如何用.net程序断开一个TCP连接 一元多项式相加c#版 如何结合C++与C#进行软件开发? 打印问题,请高手赐招。 关于windows服务的问题,郁闷死了,100分赠送 用c#编写函数 输入数值 输出字符串 如何做个tabcontrol用户控件
dt数据量是很大,有2w多行,你的意思是因为dt数据量大,linq多次操作导致慢吗。怎么办呢
而不是做个for循环一次一次的去查.
跟做两层循环遍历比较有什么本质区别么
where _dtQueryRetGroupId.Contains(item.Field<int>("组号"))
select item;
类似如此。
我只查了一次sql,然后用linq进一步筛选,linq里面的where就是筛选条件,对于每组筛选结果,还要做进一步处理。你说我不用for循环筛选,你能有什么好办法
不过我这个需求用建立关联表似乎也没有什么关系呢。
而此处的需求导致了数据量的巨大,这也是没有办法的事情,目前的解决办法是:在第一次获得dt的时候,采用异步委托来完成以上过程,并将结果保存在成员的dataTable中,当真的需要执行以上过程时,直接使用成员中已经处理好的dataTable.也就是说,复杂耗时的计算在其他地方有后台计算,保存,以后要用就直接用缓存值。 综上所述,这其实是一个缓存技术,数据库中有很多记录,我只select一次就筛选出我指定的记录,然后再到内存中继续筛选。当出现了内存中数据依然很庞大的情况时,就再加一层缓存,最后的结果就是:耗时的操作只做一次。
我只查了一次sql,然后用linq进一步筛选,linq里面的where就是筛选条件,对于每组筛选结果,还要做进一步处理。你说我不用for循环筛选,你能有什么好办法
先筛选出所有符合的,然后遍历结果集去进一步处理.
而不是每次只筛出一个来,筛一个处理一个.