【问题标题】:Insert records in datatable在数据表中插入记录
【发布时间】:2013-01-14 06:51:34
【问题描述】:

我在 DataTable 中有大约 10 万条记录,默认值列 EdgeId 为 0

我正在使用以下linq 查询在此表中插入值

foreach (IEdge ed in edCol)
{
    var row  = from r in dtRow.AsEnumerable()  
               where (((r.Field<string>("F1") == ed.Vertex1.Name) && 
                       (r.Field<string>("F2") == ed.Vertex2.Name)) || 
                      ((r.Field<string>("F1") ==ed.Vertex2.Name) &&
                       (r.Field<string>("F2") == ed.Vertex1.Name)))
               select r;

    foreach (DataRow rows in row)
    {
        row["EgdeId"]=ed.Id;
    }
}

内部foreach loop 需要大部分时间来执行。

有没有更好的方法在DataTable 中插入记录而不为每个DataRow 使用这个foreach loop

【问题讨论】:

  • linq 内部是一个 foreach 循环。
  • 什么是 lakh Kumar?我们不会说印度语:)
  • 最重要的是,您至少需要尝试才能理解。你的循环没有插入任何东西。它正在做一个选择。多少时间? 150 万行是需要提取的大量数据,如果这只是几秒钟,可能只是您的网络速度。
  • 大约需要 5-6 分钟
  • 有很多东西称为行或行,它们似乎在内部 for 循环中交换。我怀疑 ed 是由外部 for 循环定义的,但它丢失了。

标签: c# linq foreach


【解决方案1】:

看起来您正在为 edCol 中的每个项目迭代 dtRow。如果 dtRow 中的项目数很大,并且匹配项目的数量相对较少,您可以预处理 dtRow 以构建从 (ed.Vertex1.Name, ed.Vertext2.Name) 到行列表的有效映射。例如 Dictionary, List>.

【讨论】:

    【解决方案2】:
    var query = from r in dtRow.AsEnumerable()
                from ed in edCol
                let f1 = r.Field<string>("F1")
                let f2 = r.Field<string>("F2")
                let v1 = ed.Vertex1.Name
                let v2 = ed.Vertex2.Name
                where (f1 == v1 && f2 == v2) || 
                      (f1 == v2 && f2 == v1)
                select new { Row = r, EdgeId = ed.Id };
    
    foreach(var item in query)
       item.Row["EgdeId"] = item.EdgeId;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多