2012-02-16 103 views
3

如何編寫包含待處理插入的查詢以及數據庫中的記錄?我使用EF 4.3 Code First。查詢包含待處理的插入

Ex。

Foo = new Foo { Bar = 5 }; 
dbContext.Set<Foo>.Add(foo); 

IEnumerable<Foo> foos = dbContext.Set<Foo>.Where(f => f.Bar == 5).ToList(); 

ActOnFoos(foos); 

dbContext.SaveChanges(); 

我想foos到包括在數據庫中的記錄,以及被掛起的插入記錄。我只獲取數據庫中的值。

在我的實際代碼中,我會在運行我的查詢之前插入/更新多個Foos。

編輯

我要找的東西,也有類似的行爲FindFind將首先檢查上下文,然後在沒有找到任何內容的情況下轉到數據庫。我想結合上下文和數據庫的結果。

回答

3

試試這個:

DbSet<Foo> set = dbContext.Set<Foo>(); 

Foo = new Foo { Bar = 5 }; 
set.Add(foo); 

IEnumerable<Foo> foos = set.Local 
          .Where(f => f.Bar == 5) 
          .Union(set.Where(f => f.Bar == 5) 
            .AsEnumerable()); 
ActOnFoos(foos); 

dbContext.SaveChanges(); 

或者與改變操作的順序是更好的選擇:

DbSet<Foo> set = dbContext.Set<Foo>(); 

var data = set.Where(f => f.Bar == 5).AsEnumerable()); 

Foo = new Foo { Bar = 5 }; 
set.Add(foo); 

IEnumerable<Foo> foos = set.Local.Where(f => f.Bar == 5); 

ActOnFoos(foos); 

dbContext.SaveChanges(); 
+0

我希望避免這種情況,但它看起來像我唯一的選擇。我正在做第一次,但第二次看起來很有趣。兩者之間有明顯的性能差異嗎? – cadrell0 2012-02-17 13:40:11

+0

根據項目的數量,它可以有一些差異,因爲避免了聯合(它比較了確保每個實體只出現一次的集合)。 – 2012-02-17 16:17:19

1

我認爲在事務中實際插入記錄會更好,如果您決定不想插入它們,則會回滾。

+1

如何將一個交易的幫助? – jrummell 2012-02-16 21:37:11

+0

它可以讓你回滾所有的變化,如果你決定你不想保留它們。 – zmbq 2012-02-16 21:40:22

+1

讓我改說一下。交易如何回答OP的問題? – jrummell 2012-02-16 21:45:54