2013-02-15 157 views
0

下面的方法正常工作在我的服務層:使用EF代碼優先本地extention

public override IList<City> GetAll() 
{ 
      var query = from item in _tEntities 
         select item; 
      query.Load(); 
      return _tEntities.Local; 
} 

,但是當我嘗試運行下面的方法,該方法返回GETALL()方法加載舊數據。

public override IList<City> GetAll(Func<City, bool> predicate) 
     { 
      var query = from item in _tEntities 
         select item; 
      query.Where<City>(predicate); 
      query.Load(); 
      return _tEntities.Local; 
     } 

什麼問題,我該如何解決它們?
如何在本示例中使用本地方法並將新數據重新加載到本地(緩存)?

+0

難道你不應該'返回查詢;'? – 2013-02-15 23:51:17

回答

0

我也不太清楚,你正在努力實現與.Load方法在這裏是什麼,但它似乎是你想要的下面。

public override IList<City> GetAll(Func<City, bool> predicate) 
{ 
    return _tEntities.Where<City>(predicate).ToList(); 
} 
1

您正在看錯問題。你最可能看到的是,當你做第一個查詢時,本地緩存是空的。所以它只會返回查詢結果。但是當你做第二個時,它會返回第一個查詢和第二個查詢的結果。

這歸結爲一個事實,即所有正在使用的方法之間共享的DbContext。本地包含上下文檢索的所有記錄的緩存,而不僅僅是最近的查詢。

正確的解決方案是不是以這種方式使用本地。更好的是,不要使用共享上下文,因爲這會導致上下文緩存膨脹。

0
query.Where<City>(predicate); 

這不會改變query。下一行的query.Load()忽略斷言:你打電話query.Load()而不是query.Where<City>(predicate).Load()。這是因爲如果你寫

int i = 3; 
i + 1; 
Console.WriteLine(i); // still prints 3 

在這個例子中,C#並沒有真正實際允許除了被用作聲明,但.Where(predicate)是一個方法調用,方法調用可以作爲這樣,即使他們返回值。

這是不是你唯一的問題(見其他答案),但我的猜測是,這個問題是導致你所看到的意想不到的結果之一。