效率低下的LINQ Foreach声明超时

时间:2017-02-20 15:33:43

标签: c# linq foreach

我有一个问题,当循环我的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;

但无济于事,因为它只是掩盖问题。

2 个答案:

答案 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
}

再一次,我说的是没有所有的背景;如果您使用EFLinqToSQLDataReader转换为IEnumerable ...

,答案会有所不同