我有一个问题,当循环我的foreach语句时,我的应用程序返回超时错误。请注意我无法修改或查看我正在查询的表格。
IEnumerable<MyTable> TContextData;
if (!string.IsNullOrEmpty(id)
|| !string.IsNullOrEmpty(name)
|| !string.IsNullOrEmpty(cell)
)
{
TContextData = (from e in db.mytable
where (!String.IsNullOrEmpty(e.id))
select e);
}
else
{
TContextData = null;
}
List<EachC> mDatalist = new List<EachC>();
if (TContextData != null)
{
foreach (var i in TContextData.ToList())
{
EachMR EachM = new EachMR();
EachM.Feature = i.TRuid;
EachM.Feature2 = i.TRuid2;
EachM.Feature3 = i.TRuid3;
EachM.Date = GetInnerTextfromXML(EachM.Feature3, "/Sections/Multiple/Functions/Group/Date");
mdatalist.Add(EachM);
}
}
有大约40K行要迭代。有没有办法让我更有效率?
错误消息:System.Data.Entity.dll中出现“System.OutOfMemoryException”类型的异常,但未在用户代码中处理
我在Context中增加了超时
((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 0;
但无济于事,因为它只是掩盖问题。
答案 0 :(得分:0)
删除.ToList()
可能有所帮助。您的代码不必要地缓冲查询在列表中返回的所有内容,然后迭代该列表。只需循环TContextData
。
答案 1 :(得分:-1)
如果没有确切的消息,很难判断超时的来源;但我猜它不是SQL超时。
您的代码实际上正在执行的是针对您尝试在foreach
中检索的每一行执行针对数据库的查询 - 我的意思是您可能正在执行40,000个查询。相反,您应该将数据加载到内存中,并使用.ToList()
方法在列表上执行代码,该方法将执行一次查询。
IEnumerable TContextData;
if (!string.IsNullOrEmpty(id)
|| !string.IsNullOrEmpty(name)
|| !string.IsNullOrEmpty(cell))
{
TContextData = (from e in db.mytable where (!string.IsNullOrEmpty(e.id)) select e);
}
foreach(var i in TContextData.ToList())
{
//do stuff
}
再一次,我说的是没有所有的背景;如果您使用EF
,LinqToSQL
或DataReader
转换为IEnumerable
...