【问题标题】:replacing column values in a datatable and getting value in datatable datatype using linq使用 linq 替换数据表中的列值并获取数据表数据类型中的值
【发布时间】:2019-10-31 10:00:18
【问题描述】:

我有一个包含 97 列的数据表,在这 97 列中有一列(例如列号 20),我必须在该特定行中的所有值中添加一个字母 (A)。如何使用 linq 实现这一目标?

我尝试将选择代码分配给变量,但我不能使用 New With,因为我必须在 数据行加载器方法中写入所有 97 列.

有没有办法在使用new with方法时动态添加所有列名。

感谢您的帮助

我也用过:

DT.AsEnumerable().Select(Function(r) cstr(r("Account")).Replace(cstr(r("Account")),"'"+cstr(r("Account"))) ).ToList)

使用这种方法,但我得到一个列表,有没有办法可以用这个列表值代替列值?

【问题讨论】:

  • 一行中的所有值,还是所有记录的一列中的所有值?
  • 如果没有 Linq,这会容易得多,数据读取器可以访问具有索引的列
  • 你好@GertArnold 一列中的所有值!!
  • 你好@Luc你能告诉我更多关于我没有使用过的数据阅读器的信息
  • 这听起来像是糟糕的数据库设计。通过适当的规范化,您可能只修改了一条记录中的一个值。无论如何,不​​要为此使用 LINQ。只需从您的 VB 代码中执行一个简单的 SQL 更新语句。

标签: c# vb.net linq


【解决方案1】:

当 for 循环如此简单时,将开发人员的时间浪费在正则表达式上有点愚蠢。毕竟正则表达式在幕后进行循环。

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    For Each row As DataRow In dt.Rows
        row(3) = "A" & row(3).ToString
    Next
End Sub

【讨论】:

  • 您确定您了解用户的需求吗?如果您想更改该列的所有行,这是最好的解决方案,但如果您想更改单行,我建议您使用正则表达式,因为 Windows 库在 C 中,C 对内存的处理方式与 vb.net 不同,而且更多高效的。调用与您的“有点傻”不同的解决方案有点傻
  • 你好@Mary,你的解决方案很棒,但我不想为每一个都使用,因为记录要高得多,而且我需要很长时间才能获得所需的输出。这就是我在寻找的原因对于 linq 替代方案....
  • @Vickydas 在你找出正则表达式之后计时。正则表达式甚至可能更慢。
  • 有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。从我未能记录的人那里窃取的报价。 :-)
  • @Vickydas 直接更新数据库怎么样?让服务器完成工作。
【解决方案2】:

这可能会对您有所帮助。 我在代码cmets中写了一些信息

'In this mode you update the sixth row (only the column 20)
Dim query As EnumerableRowCollection(Of Object) = From dRow As DataRow In Dt.AsEnumerable()
                                                  Select col20 = dRow.Item(20)
                                                  Skip 5
                                                  Take 1



For Each Row As DataRow In query
    Row.Item(0) = "A"
Next


'In this mode you get all rows 
Dim queryAllRowData As EnumerableRowCollection(Of DataRow) = From dRow As DataRow In Dt.AsEnumerable()




For Each Row As DataRow In queryAllRowData
    Row.ItemArray = {"A", "A", "A", "A", "A", "A"} ' put here (or do any method to give) your 90 column data
Next





'Don't forget commit changes
Dt.AcceptChanges()

【讨论】:

  • 如果你想更新数据库,不要打电话给.AcceptChanges()。您可以在更新后调用它。
  • 假设用户正在使用数据库。不清楚你想说什么,但看这里:docs.microsoft.com/en-us/dotnet/api/…
  • 感谢您抽出宝贵时间@G3nt_M3caj,但正如我之前所说,我不想为每个人使用
  • 不执行“For”循环就没有“Linq”或等效方法(我意识到您想在 cmets 之后更改列的值)。因此,最好的解决方案是@Mary(错误猎人)提出的解决方案,而不会重复来自“Linq”的工作负载。感谢回复
  • @G3nt_M3caj 调用 .AcceptChanges updates DataRow .RowState 这使得无法使用 DataAdapter 更新数据库或手动拉出 .RowState 的行并更新数据库.从您发布的链接中,“每个 DataRow 的 RowState 属性也会发生变化;添加和修改的行变为未更改,删除的行被删除。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
相关资源
最近更新 更多