使用LINQ的.NET 4.0 Update中的DataTable?

时间:2011-11-29 16:20:34

标签: linq datatable dataset

我有一个如下所示的DataTable。我想知道是否有人知道使用Linq根据字符串长度规则的DataTable截断行值的一种很酷的方式。

数据表:

        var testtable = new DataTable();
        testtable.Columns.Add( "cola" , typeof( String ) );
        testtable.Columns.Add( "colb" , typeof( String ) );
        testtable.Columns.Add( "colc" , typeof( String ) );
        testtable.Rows.Add( new object[] { "1" , "22" , "333" } );
        testtable.Rows.Add( new object[] { "4444" , "55555" , "666666" } );
        testtable.Rows.Add( new object[] { "7777777" , "88888888" , "999999999" } );

规则表:

        var ruletable = new DataTable();
        ruletable.Columns.Add( "columnname" , typeof( String ) );
        ruletable.Columns.Add( "length" , typeof( Int32 ) );
        ruletable.Rows.Add( new object[] { "colb" , 3 } );
        ruletable.Rows.Add( new object[] { "colc" , 4 } );

现实生活数据表有180列和1,000行。规则表有180行(每列一行),所以我希望大师可以评论我如何使用Linq动态地根据规则表中的内容从testtable中获取最左边的字符。

感谢。

2 个答案:

答案 0 :(得分:1)

这可能不像你想要的那样花哨(而且它不使用Linq)但是它很简单并且有效。我在VB中写的因为我有点快,但如果你需要我用C#编辑我的答案,我可以在几分钟内完成。

'loop through all of the rows in testtable'
For Each tr As Data.DataRow In testtable.Rows
    tr.BeginEdit()

    'loop through all of the rules'
    For Each drrule As Data.DataRow In ruletable.Rows
        'update the value in testtable column represented by rule rows "columnname" field'
        'based on the rules rows "length" field'
        tr(drrule("columnname")) = Left(tr(drrule("columnname")), drrule("length"))
    Next
    tr.AcceptChanges()
Next

如果您需要我在C#中重写它,请告诉我,我会尽快编辑它。

答案 1 :(得分:1)

LINQ在这里帮助不大 - 它通常用于查询数据,而不是更改数据。由于您希望更新每行的状态,因此最好使用命令式方法。嵌套的foreach可能是最合适的。您应该首先迭代规则以避免解析testTable中每一行的长度:

foreach(var ruleRow in ruleTable.AsEnumerable())
{
    var columnName = ruleRow.Field<string>("columnname");
    var length = ruleRow.Field<int>("length");

    foreach(var testRow in testTable.AsEnumerable())
    {
        var value = testRow.Field<string>(columnName);

        testRow.SetField(columnName, value.Substring(0, length));
    }
}

LINQ最多可用于查询截断值,但您仍需要执行foreach来执行更新。这里最真实的LINQ就是.AsEnumerable()上的DataTable方法。