如何使用LINQQ或任何其他方法更新所有行的数据表的第一列?

时间:2017-02-01 12:23:47

标签: c# datetime datatable timezone

我有一个数据表,其中包含4列datetime,id,message&状态。我想用新的日期时间更新datetime列(更新的日期时间在不同的时区,从CST到UTC)。首先,我想要这样做,就像我将采用datetime列并将其存储在列表中并将列表从cst转换为utc时区。然后将列表添加到同一个表并重新排列列。但这听起来很愚蠢,所以有没有办法用一列数据表的新值更新现有值。

我在其中一个帖子中找到了以下代码,但不确定究竟发生了什么。

var rowsToUpdate = 
dt.AsEnumerable().Where(r => r.Field<string>("datetime") == datetime);

foreach(var row in rowsToUpdate)
{
   row.SetField("datetime", utcDate);
}

数据表中的数据是在CST时区,但我希望将时区转换为UTC时区并更新表。

List<DateTime> lstCST = new List<DateTime>();
lstCST = datatable.AsEnumerable().Select(r=>r.Field<DateTime>("CSTDatetime")).ToList();
List<DateTime> lstUTC = new List<DateTime>();
DateTime dt = DateTime.Now;

foreach(var v in lstCST )
{
     dt= TimeZoneInfo.ConvertTimeToUtc(v);
     lstUTC.Add(dt);
}

任何人都可以指出我如何做到这一点的正确方向。

3 个答案:

答案 0 :(得分:3)

如果要更新所有行,则不需要LINQ,TimeZoneInfo.ConvertTimeToUtc

TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");

foreach (DataRow row in dataTable.Rows)
{
    DateTime cstDateTime = row.Field<DateTime>("CSTDatetime");
    DateTime utcDateTime = TimeZoneInfo.ConvertTimeToUtc(cstDateTime, cstZone);
    row.SetField("CSTDatetime", utcDateTime);
}

答案 1 :(得分:1)

解释代码片段的作用:

这是一个过滤器:

var rowsToUpdate = 
dt.AsEnumerable().Where(r => r.Field<string>("datetime") == datetime);

它选择“datetime”列具有特定值的所有行。在您的情况下,我猜您可以忽略这一点,您希望在所有行上执行此操作。

因此,不是迭代过滤的行,而是迭代所有行。

foreach(var row in rowsToUpdate)
{
   row.SetField("datetime", utcDate);
}

后一个片段将所选内容的每一行中的“datetime”值设置为utcDate的值。在您的情况下,只需首先获取“旧”值,转换它然后使用上面的行来设置转换后的值来替换它。

@TimSchmelter已经给了ready-to-go solution所以我不会重复它。我宁愿想解释一下看似不清楚的事情。

答案 2 :(得分:0)

看看这个例子:

DataTable table = new DataTable();

table.Columns.AddRange(new DataColumn[]
    {
        new DataColumn(),
        new DataColumn(),
        new DataColumn()
    });

table.Rows.Add(1, 2, 3);

foreach (DataRow dr in table.Rows)
{
    dr[0] = 99;
}

它将更新第一列的所有行并将其设置为99