2011-08-24 70 views
0

我使用具有Get方法一GenericRepository:在EF中使用Take擴展方法的內存中有多少個對象?

我想知道是否有代碼以下塊之間的負載差異:

Expression<Func<PressRelease_ar, bool>> exp = p => p.Id <=5 ; 
lst = Global.uow.PressReleaseRepository_ar 
     .Get 
     (
     filter : exp, 
     orderBy: n => n.OrderByDescending(d => d.Id) 
     ).ToList(); 

而且

lst = Global.uow.PressReleaseRepository_ar 
      .Get 
      (
      orderBy: n => n.OrderByDescending(d => d.Id) 
     ).Take(5).ToList(); 

更多詳細信息,這是Get方法:

public virtual IEnumerable<TEntity> Get(
           Expression<Func<TEntity, bool>> filter = null, 
           Func<IQueryable<TEntity>, 
           IOrderedQueryable<TEntity>> orderBy = null, 
           string includeProperties = "") 
    { 

     IQueryable<TEntity> query = dbSet; 

     if (filter != null) query = query.Where(filter); 

     foreach (var includeProperty in includeProperties.Split 
       (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) 
     { 
      query = query.Include(includeProperty); 
     } 


     if (orderBy != null) return orderBy(query).ToList(); 
     else return query.ToList(); 
    } 
+0

你的Get方法中有語法錯誤。 – Alxandr

+0

你的問題題目很混亂。急切和懶惰加載指的是加載實體的*導航屬性*的不同方法。你的問題與加載導航屬性無關,是嗎? – Slauma

+0

@Slauma:請給出建議標題。感謝您的回答,滿意。 – Samidjo

回答

2

您的Get方法會導致執行查詢(您在方法的末尾使用ToList())。這就導致了一個很大的區別:

  • 你的第一個查詢查找所有行ID爲< = 5數據庫和物化只有那些行作爲實體。所以你得到最大。內存中有5個對象(假設您的最小ID是1)。

  • 您的第二個查詢根本沒有應用於SQL的過濾器。所以它按照id降序對整個表進行排序,然後返回完整的表格和表中的行數將會在內存中實現的數量。在這個內存集合上,你應用Take(5)(LINQ到對象,而不是LINQ到實體),這意味着你然後扔掉除前五個之外的所有對象。

第二個查詢不好。 Take(5)應在您的Get方法內執行IQueryable以確保前5行的選擇實際發生在數據庫中,並且只有這5個對象在內存中創建。

相關問題