none
Entity FramWork 4 有關於 entity to sql使用contain取大資料發生問題 RRS feed

  • 問題

  • 我有一張view串了六張表(約有70幾個欄位),約為兩百萬筆資料

    使用Iqueryable當列舉

    IQueryable<PersonDetailView> =mdata.table; using (var readcontext = new context()) { _detail = readcontext.PersonDetailView.AsNoTracking(); string[] parmcode = parmlist.Where(x => x.codetype == "08")

    .Select(x => x.ParmCode).ToArray();

    _detail = _detail.Where(x => parmcode.Contains(x.kind)); return _detail.ToList(); }

    parmcode 為一維陣列有12個元素 有關於人的類別

    當ToList時會發生out of memory

    透過entity產生的語法在sql上是可以執行約為24萬筆資料

    而當執行這段sql時IIS記憶體會爆增至80萬kb最後發生out of memory

    而同樣的寫法這次改為如下

      IQueryable<PersonDetailView> =mdata.table;
    
                using (var readcontext = new context())
                {
    
                     _detail = readcontext.PersonDetailView.AsNoTracking();
    
       
                        string[] parmcode = parmlist.Where(x => x.codetype == "08") 
    
                           .Select(x => x.ParmCode).ToArray();
    
                        _detail = _detail.Where(x => x.name.StarWish("林")));
                        
                    
    
         
                    return _detail.ToList();
                } 

    在Tolist時是正常運作的

    可以產生21萬筆資料 , 記憶體也約為 30萬kb

    想請問是否.Net Entity對於Contain有任何額外的處理?

    還是有可以取代Contain的寫嗎?



    2014年5月19日 下午 05:02

解答

  • 有試過用IEnumerable當列舉, 再用AsEnumerable()取代ToList嗎?

    IEnumerable<PersonDetailView> =mdata.table;

               
    using (var readcontext = new context())
               
    {

                     _detail
    = readcontext.PersonDetailView.AsNoTracking();

      
                       
    string[] parmcode = parmlist.Where(x => x.codetype == "08")

                           .Select(x => x.ParmCode).ToArray();

    _detail = _detail.Where(x => parmcode.Contains(x.kind));
                       
                   

        
                   
    return _detail.AsEnumerable();
               
    }

    • 已標示為解答 ChengHanYang 2014年5月20日 上午 05:26
    2014年5月20日 上午 03:54

所有回覆

  • 這種大量搜尋、比對的工作,寫成SP給資料庫來做呢?

    理直氣和,切記。

    推廣

    微軟免費中文影音線上教學網站

    個人

    2014年5月20日 上午 01:56
  • 有試過用IEnumerable當列舉, 再用AsEnumerable()取代ToList嗎?

    IEnumerable<PersonDetailView> =mdata.table;

               
    using (var readcontext = new context())
               
    {

                     _detail
    = readcontext.PersonDetailView.AsNoTracking();

      
                       
    string[] parmcode = parmlist.Where(x => x.codetype == "08")

                           .Select(x => x.ParmCode).ToArray();

    _detail = _detail.Where(x => parmcode.Contains(x.kind));
                       
                   

        
                   
    return _detail.AsEnumerable();
               
    }

    • 已標示為解答 ChengHanYang 2014年5月20日 上午 05:26
    2014年5月20日 上午 03:54
  • 測試是正確的

    我還是用Iqueryable當列舉

    謝謝你提供的建議

    我會去找相關的文獻去看.AsEnumerable是什麼意思

    2014年5月20日 上午 05:29
  • 往後會朝這方面嘗試


    2014年5月22日 上午 05:11