我有一个数据库同步作业,我在XML中循环遍历1000多行,并使用EF4.1更新数据库表格中的任何更改
我的代码是:
using (context = new MyDbContext())
{
foreach (var row in document.Elements("row"))
{
//DO UPDATING IN HERE.
//Part of which I call
var results = context.Set(type).SqlQuery("select top 1 * from " + type.Name + " where ExternalId=@p0", id); // this is the SQL running too long
return results.Cast<MyObject>().FirstOrDefault();
}
}
“选择前1名...”查询似乎是失败的查询。 可能是什么问题呢。我应该在For循环中声明我的上下文吗?
答案 0 :(得分:1)
我可以看到一个缓慢的解释是你在查询的表中没有ExternalId
的索引 - 所以你正在执行全表扫描而不是索引查找。
你的查询目前没有多大意义 - 你有一个foreach
但是返回你要加载的第一个结果 - 为什么循环呢?
如果在循环中运行此问题,另一个问题是您正在进行非常昂贵的N次数据库往返。如果您只是尝试加载一组与XML中找到的ID匹配的实体,我会批量加载它们。只需执行Contains()
查询并传入一组ID。
答案 1 :(得分:0)
建议先从数据库加载所有数据,然后在结果集合中更新foreach中的每个实体。