使用LINQ更新DataTable中的两列数据

11

我希望使用LINQ查询在单行中更新DataTable的两列。目前我使用以下两行来完成相同的功能:

oldSP.Select(string.Format("[itemGuid] = '{0}'", itemGuid)).ToList<DataRow>().ForEach(r => r["startdate"] = stDate);
oldSP.Select(string.Format("[itemGuid] = '{0}'", itemGuid)).ToList<DataRow>().ForEach(r => r["enddate"] = enDate);

我该如何使用一个 Select 在一行中完成这个操作?


1
“单行”方法在某些情况下可能不太易读且效率低下。请使用 LINQ 查询和 foreach 循环。 - Tim Schmelter
@TimSchmelter 我有一个巨大的数据表(1000条记录),使用多行方法将比单行方法需要更多时间。 - user1310152
1
你正在混淆代码行和CPU周期。一行代码可能需要比100行代码多1000倍的时间。始终首先使用最可读性和可维护性的方法。 - Tim Schmelter
@TimSchmelter 在每一行中我们都要进行选择,难道1000次选择不比2000次选择更好吗? - user1310152
你可以简单地存储结果,因为你选择了相同的DataRows两次。但是ToList是多余的,因为DataTable.Select已经返回了一个集合,因此你在浪费内存。你接受的LINQ方法根本不需要另一个集合(除了DataTable)。foreach直接枚举查询。你也可以在foreach中枚举DataTable.Rows并使用if(condition...)来检查是否必须更新此行。这将是最有效和直接的方法。 - Tim Schmelter
4个回答

35

你可以在一行代码中完成它,只需将适当的委托操作传递给ForEach方法:

oldSP.Select(string.Format("[itemGuid] = '{0}'", itemGuid))
     .ToList<DataRow>()
     .ForEach(r => { 
        r["startdate"] = stDate;
        r["enddate"] = enDate;
      });

你也可以使用 LINQ to DataSet(在我看来更易读,而不是一行代码):

var rowsToUpdate = 
    oldSP.AsEnumerable().Where(r => r.Field<string>("itemGuid") == itemGuid);

foreach(var row in rowsToUpdate)
{
    row.SetField("startdate", stDate);
    row.SetField("enddate", enDate);
}

2

使用花括号来进行两个或多个操作:

oldSP.Select(string.Format("[itemGuid] = '{0}'", itemGuid))
       .ToList<DataRow>()
       .ForEach(r => { r["enddate"] = enDate); r["startdate"] = stDate; });

但为了代码可读性,我会使用老式的foreach循环。


1

Try this :

oldSP.Select(string.Format("[itemGuid] = '{0}'", itemGuid)).ToList<DataRow>()
     .ForEach(r => { r["startdate"] = stDate; r["enddate"] = enDate; });

-1

我不喜欢在网上看到的任何示例,所以这是我的示例

        DataTable dt = new DataTable();
        dt.Columns.Add("Year");
        dt.Columns.Add("Month");
        dt.Columns.Add("Views");
        for (int year = 2011; year < 2015; year++)
        {
            for (int month = 1; month < 13; month++)
            {
                DataRow newRow = dt.NewRow();
                newRow[0] = year;
                newRow[1] = month;
                newRow[2] = 0;
                dt.Rows.Add(newRow);
            }
        }

        dataGridView1.DataSource = dt;

        //if using Lambda 
        //var test = dt.AsEnumerable().Where(x => x.Field<string>("Year") == "2013" && x.Field<string>("Month") == "2").ToList();

        var test = (from x in dt.AsEnumerable()
                    where x.Field<string>("Year") == "2013"
                    where x.Field<string>("Month") == "2"
                    select x).ToList();


        test[0][0] = "2015";

        dt.AcceptChanges();

//如果要写入 SQL,请使用 dt.SubmitChanges() 代替


问题明确说明了“使用LINQ更新DataTable中的两列”,而您的解决方案并不基于LINQ。 - StartCoding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接