用于组合数据的实体框架算法
这与我正在继承的项目有关,并且不能更改表结构或数据访问模型。 我被要求优化用于将数据插入数据库的算法。
我们在表T中有一个数据集。从那里,我们拉一个我们将称为A的集合。我们还查询一个XML馈送并获得一个集合,我们将称之为X.
所有这些更改都需要插回到数据库中。
算法设置如下:
Query XML into a LIST
foreach over the XML LIST
look up foreach.item in A via LINQ (i.e. query = from record in A where
record.GUID == foreach.item.GUID
select record)
if query.Count() == 0
insert into A (via context.AddToTableName(newTableNameObject)
else
var currentRecord = query.First()
set all properties on currentRecord = properties from foreach.item
context.SaveChanges()
我知道这是不理想的。 我试图将A转换成foreach循环之外的一个对象(称为queryA),以便将查询移动到内存中而不是击中磁盘,但是在思考完后,我意识到数据库已经在内存中。
在计算器中添加了定时器对象后,很明显最耗时的是SaveChanges()函数调用。 在某些情况下,它是20ms,而在另一些情况下,可以明确地说,它会跳到100ms。
我宁愿只调用一次SaveChanges()。 鉴于我对EF的深入了解(最好是薄的)以及无法更改表结构以及必须保留A中不包含X的数据的限制,我无法弄清楚如何实现这一点。
建议?
我不认为在使用Entity框架时你会提高性能:
查询
Contains
(如IN
的SQL)。 Contains
仅由.NET 4.0支持。 数据修改
SaveChanges
。 你可以在foreach循环之后调用它,它仍然可以工作。 它将在单次交易中通过所有修改,但您不会通过此类操作获得任何性能提升,并且根据此答案,它可以为您提供显着提升。 问题不在算法中,而在于处理用于处理数据的数据和技术的方式。 实体框架不适合数据泵使用。 你应该将这些信息交给你的老板,因为提高性能意味着你的应用程序的更复杂的变化。 这不是你的错,它不是程序员做这个应用程序的错。 这是EF的一个特征,它不是很知名,因为我知道它在任何MS最佳实践中都没有明确说明。
链接地址: http://www.djcxy.com/p/33555.html上一篇: Entity Framework Algorithm For Combining Data
下一篇: How can I get Id of inserted entity without saveChanges in Entity framework?