2012-02-16 102 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