Как использовать лямбда-выражения для фильтрации DataRows?

Как я могу искать строки в datatable для строки с Col1 = "MyValue"

Я думаю что-то вроде

Assert.IsTrue(dataSet.Tables[0].Rows.
    FindAll(x => x.Col1 == "MyValue" ).Count == 1);

Но, конечно, это не работает!

Ответ 1

Вы можете использовать LINQ to DataSets, чтобы сделать это:

Assert.IsTrue(dataSet.Tables[0].AsEnumerable().Where(
    r => ((string) r["Col1"]) == "MyValue").Count() == 1);

Примечание. Вы также можете сделать это без вызова Assert:

dataSet.Tables[0].AsEnumerable().Where(
    r => ((string) r["Col1"]) == "MyValue").Single();

Если количество строк не равно одному (следовательно, вызов "Single" ), тогда будет выбрано исключение, и это необработанное исключение должно завершиться неудачно. Лично мне нравится последний, поскольку он имеет более четкое смысловое значение.

Вышеупомянутое может быть дополнительно уменьшено до:

dataSet.Tables[0].AsEnumerable().Single(
    r => ((string) r["Col1"]) == "MyValue");

Кроме того, вы можете воспользоваться Field методом на DataRowExtensions class, чтобы упростить доступ к полю в виде типа (а также предоставить дополнительную выгоду от преобразования DBNull для нуль-копий в .NET):

dataSet.Tables[0].AsEnumerable().Single(
    r => r.Field<string>("Col1") == "MyValue");

Ответ 2

Вы можете попробовать следующее:

var b=datatable.AsEnumerable.where(p=> p.Field<string>   
("column_name")=="desire_value").CopyToDataTable()

Ответ 3

Для этого вы можете использовать метод Select таблицы данных или свойство фильтра DefaultDataView в таблице.

Для метода Select:

var rows = dataSet.Tables[0].Select("Col1 = 'MyValue'");

Для фильтра DefaultView:

dataSet.Tables[0].DefaultView.Fitler = "Col1 = 'MyValue'";
foreach (var drv in dataSet.Tables[0].DefaultView)
{
    // Do your processing
}

Ответ 4

Зачем использовать лямбда, а не выбрать?

  DataRow[] foundRow = ( dataSet.Tables[0].Rows.Select("Col1 = 'MyValue'");

Ответ 5

Код, который вы написали, проверяет, что существует только одна строка, которая выполняет ваше условие поиска. Если вам действительно нужны строки, оставьте Assert и Count