DataTable в .NET 4.0 Обновление с помощью LINQ? - PullRequest
0 голосов
/ 29 ноября 2011

У меня есть 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 столбцов и 1000 строк.Таблица правил содержит 180 строк (по одной на столбец), поэтому я надеюсь, что гуру может прокомментировать, как я могу сделать что-то динамическое с Linq, чтобы извлечь крайние левые символы из тестовой таблицы на основе того, что находится в ruletable.

Спасибо.

Ответы [ 2 ]

1 голос
/ 29 ноября 2011

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 может быть максимально использован для запроса усеченных значений, но вам все равно придется сделать1006 * для выполнения обновления.Самое лучшее, что LINQ может сделать для вас, - это метод .AsEnumerable() на DataTable.

1 голос
/ 29 ноября 2011

Это может быть не так сложно, как то, что вы ищете (и он не использует 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 #, и я отредактирую это как можно скорее.

...