Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我必须在查询中取消跳过调用吗_C#_Linq - Fatal编程技术网

C# 我必须在查询中取消跳过调用吗

C# 我必须在查询中取消跳过调用吗,c#,linq,C#,Linq,我有一张大桌子,我想在里面清理旧记录。这些记录有一个字段“FilePath”。此处的“清除”表示将“文件路径”标记为空。问题是因为该表有数百万条记录,一次更新是不可能的。它摧毁了记忆。因此,我的策略是每次提取2000行并更新它们,然后继续处理下一个块 我的问题是: int pageNumber = 0; int pageSize = 2000; bool hasHitEnd = false; while (!hasHitEnd) { var size = pageNumber * pageSi

我有一张大桌子,我想在里面清理旧记录。这些记录有一个字段“FilePath”。此处的“清除”表示将“文件路径”标记为空。问题是因为该表有数百万条记录,一次更新是不可能的。它摧毁了记忆。因此,我的策略是每次提取2000行并更新它们,然后继续处理下一个块

我的问题是:

int pageNumber = 0;
int pageSize = 2000;
bool hasHitEnd = false;

while (!hasHitEnd)
{
var size = pageNumber * pageSize;
var query = cdrContext.Mytable.Where(c => c.FacilityID == facilityID && c.FilePath != null && c.TimeStationOffHook < oldDate)
    .OrderBy(c => c.TimeStationOffHook)
    .Skip(size)
    .Take(pageSize)
    .Select(c => new { c.FilePath, c.FileName })
    .ToList();
      var q = cdrContext.Mytable.Where(c => c.FacilityID == facilityID && c.FilePath != null && c.TimeStationOffHook < oldDate)
         .OrderBy(c => c.TimeStationOffHook)
         .Skip(size)
         .Take(pageSize)
         .ToList();
foreach (var y in q)
{
   y.FilePath = null;
}
cdrContext.SaveChanges();
if (query.Count() < pageSize)
{
    hasHitEnd = true;
}
pageNumber++;
int pageNumber=0;
int pageSize=2000;
bool-hasHitEnd=false;
而(!hasHitEnd)
{
变量大小=页码*页面大小;
var query=cdrContext.Mytable.Where(c=>c.FacilityID==FacilityID&&c.FilePath!=null&&c.TimeStationOffHookc.TimeStationOffHook)
.跳过(大小)
.Take(页面大小)
.Select(c=>new{c.FilePath,c.FileName})
.ToList();
var q=cdrContext.Mytable.Where(c=>c.FacilityID==FacilityID&&c.FilePath!=null&&c.TimeStationOffHookc.TimeStationOffHook)
.跳过(大小)
.Take(页面大小)
.ToList();
foreach(变量y在q中)
{
y、 FilePath=null;
}
cdrContext.SaveChanges();
if(query.Count()
我对代码没有信心。因为在更新数据后,文件路径为空。然后在下一次运行中,它可能不会指向正确的块,因为我跳过了一个块


是否需要删除跳过部分?

您不需要跳过记录,因为更新后的下一页将成为第一页(更新的项目将与您下次调用时的查询筛选器不匹配)

//定义查询,但不执行它
var query=cdrContext.Mytable.Where(c=>c.FacilityID==FacilityID&&
c、 FilePath!=null&&
c、 TimeStationOffHookc.TimeStationOffHook)
。取(页面大小);
List itemsToUpdate=query.ToList();//获取前N个项目
while(itemsToUpdate.Any())//所有项目都已更新
{
//更新项目
cdrContext.SaveChanges();
itemsToUpdate=query.ToList();//获取前N个项目
}

无需跳过记录,后续页面将是您的第一页。此外,您无需查询数据库两次我看到您使用了query和q,这是不必要的。只需使用q,它将对性能有很大帮助。您可以删除以下代码

 if (query.Count() < pageSize)
 {
     hasHitEnd = true;
 }
if(query.Count()

如果q.count()==0,则可以将其替换为q中的记录计数;如果q.count()==0,则可以中断循环或将hasHitEnd设置为true;

这感觉更像是一个实用函数,而不是客户端函数,最好作为存储过程+计划作业来使用。没错,这里有两个查询。一个是“查询”,第二个是“q”,您的意思是忽略两者中的跳过吗?若要判断到达终点的位置,请使用query.Count()@Love我添加了一个代码示例,其中显示了如何在循环中获得与条件匹配的前N个项目
 if (query.Count() < pageSize)
 {
     hasHitEnd = true;
 }