pen*_*ake 4 .net c# entity-framework sqldatareader
我是实体框架的新手。
我有一个担忧:
我需要遍历通过 LINQ to Entities 收集的大量数据,该数据以匿名类型组合了来自不同实体的几个属性。
如果我需要一项一项地读取此查询的返回项直到最后,由于集合很大或 EF 隐式使用 SqlDataReader,我是否会面临 OutOfMemory 异常的风险?
(或者我应该使用 EntityDateReader 来确保我按顺序读取 Db (但我猜我必须将查询生成为字符串))
据我所知,您可以做两件事,首先使用 .AsNoTracking 关闭跟踪,这在大多数情况下会将您的内存设置减少一半,这可能就足够了。
如果您的集合仍然太大,请使用“skip”和“take”将结果集分块下拉。您还应该将其与 AsNoTracking 结合使用,以确保跟踪不会消耗内存
编辑:
例如,您可以使用类似以下内容的内容来循环遍历 1000 个块中的所有项目。下面的代码一次只能在内存中保存 1000 个项目。
int numberOfItems = ctx.MySet.Count();
for(int i = 0; i < numberOfItems + 1000; i+=1000)
{
foreach(var item in ctx.MySet.AsNoTracking().Skip(i).Take(1000).AsEnumerable())
{
//do stuff with your entity
}
}
Run Code Online (Sandbox Code Playgroud)