2011-11-04 13 views
1

我想了解,使這個代碼,我從另一個問題SO解除工作機制:ObjectStateManager.GetObjectStateEntries()。Select()。OfType()如何工作?

 List<ResourceType> ResourceTypes2 = 
      this.ObjectStateManager 
       .GetObjectStateEntries(EntityState.Added) 
       .Select(entry => entry.Entity) 
       .OfType<ResourceType>().ToList(); 

是一個對象的查詢或查詢EF上面?

我問的原因是我用它存儲> 100K行的表,我想確保它不必做某種行枚舉。

作爲一個側面的問題,我有什麼想法使用上述機制來實現一個Upsert工具,該工具通過讓客戶端代碼簡單地刪除然後添加到上下文中,但在保存時比較刪除和添加以實現更新該行已經存在?這將是一個「模式」,上下文被放入以避免副作用的語義。

+0

對於內存中ObjectContext/StateManager數據結構上的對象(因爲它不像@ rich.okelly的答案中所解釋的那樣是'IQueryable')並且不會發出任何數據庫查詢。對於你的「Upsert」理念:我不認爲該程序有什麼好處,並且會說:不要保護客戶不理解如何正確使用EF。如果他們需要更新,他們應該使用該機制(從DB/Attach/ApplyCurrentValues加載/更改跟蹤等),而不是調用笨拙的DeleteObject/AddObject對。 – Slauma

+0

也許我錯過了一些東西 - 我似乎是唯一一個我知道的厭惡輸入代碼反覆,看看是否已經存在一個對象,並添加它,如果是這樣,並更新它明智....這是繁瑣的樣板, 對? –

回答

1

這在很大程度上取決於this.ObjectStateManager的返回類型 .GetObjectStateEntries(EntityState.Added)

如果它返回一個IEnumerable任何後續操作將使用LinqToObjects實現,而如果它返回一個IQueryable你將會使用EF實現。

就我個人而言,我不喜歡自定義Upsert機制的想法,因爲它會爲希望在將來開發您的代碼的任何人提供學習曲線,但這僅僅是我的看法。關於這個機制的優缺點的討論,我會在討論部分提出一個單獨的問題或者一個帖子。

希望這會有所幫助。