2011-11-04 59 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机制的想法,因为它会为希望在将来开发您的代码的任何人提供学习曲线,但这仅仅是我的看法。关于这个机制的优缺点的讨论,我会在讨论部分提出一个单独的问题或者一个帖子。

希望这会有所帮助。