none
Linq to Object 速度問題 RRS feed

  • 問題

  • 我有一串Linq 速度很慢實在想不出辦法

    以下results 大概 30000筆

    orderNos大概 10000筆

    跑了大概12秒

    已經用了.AsParallel()


    首先傳入一個  List<foo>  results;

    1. var orderNos=(from p in results

                               order by p.time

                              select p.orderNo).Distinct() ;

        取出results中,依照時間排序的orderNo  List

    2.

    List<foo> lsResult=new List<foo>();

    string OrderNo="";

    var temp=from p in results.AsParallel()

                    where p.orderNo== OrderNo

                    order by p.type

                   select p;


    foreach(var ordNo in OrderNos)

    {

         orderNo=ordNo;

         lsResult.addRange(temp.toList());

    }


    2015年6月19日 下午 03:47

解答

  • 我修改了一下

    我會先幫一開始的不同值 列表定義排序

    接著用join的方式 去先著剛剛的定義好的排序 跟後續 type的排序

               List<Foo> results = GetFoos();//30000比
    
                int i = 0;
                var orderNos = (from p in results
                                orderby p.time
                                select new { p.orderNo })
                               .Distinct()
                               .Select(d => new { d.orderNo, sort = i++ });
    
                var isResult = (from oNo in orderNos
                            join r in results
                            on new { no = oNo.orderNo } equals new { no = r.orderNo }
                            orderby oNo.sort, r.type
                            select r).ToList();

    • 已標示為解答 布利 2015年6月20日 上午 04:10
    2015年6月19日 下午 04:57

所有回覆

  • 跑了 12 秒的 LINQ to Object ,而且是這麼簡單的機能 ... 你確定與來源物件真的與資料庫無關?

    下圖是我使用 LINQPad 寫的純記憶體物件測試碼,包含產生模擬資料,時間非常短暫喔(耗用時間在畫面最下方)



    dino

    2015年6月19日 下午 04:23
  • 跑了 12 秒的 LINQ to Object ,而且是這麼簡單的機能 ... 你確定與來源物件真的與資料庫無關?

    下圖是我使用 LINQPad 寫的純記憶體物件測試碼,包含產生模擬資料,時間非常短暫喔(耗用時間在畫面最下方)



    dino

    看起來你只有做  原文1  distinct 的動作

    那樣不慢

    慢的是2.

    2.

    List<foo> lsResult=new List<foo>();

    string OrderNo="";

    var temp=from p in results.AsParallel()

                    where p.orderNo== OrderNo

                    order by p.type

                   select p;

    foreach(var ordNo in OrderNos)

    {

         orderNo=ordNo;

         lsResult.addRange(temp.toList());

    }

    2015年6月19日 下午 04:45
  • 你的步驟二其實十分怪異 .... 應該是寫錯了,結果也不對吧

    一樣很快



    dino

    2015年6月19日 下午 04:56
  • 我修改了一下

    我會先幫一開始的不同值 列表定義排序

    接著用join的方式 去先著剛剛的定義好的排序 跟後續 type的排序

               List<Foo> results = GetFoos();//30000比
    
                int i = 0;
                var orderNos = (from p in results
                                orderby p.time
                                select new { p.orderNo })
                               .Distinct()
                               .Select(d => new { d.orderNo, sort = i++ });
    
                var isResult = (from oNo in orderNos
                            join r in results
                            on new { no = oNo.orderNo } equals new { no = r.orderNo }
                            orderby oNo.sort, r.type
                            select r).ToList();

    • 已標示為解答 布利 2015年6月20日 上午 04:10
    2015年6月19日 下午 04:57