Как использовать лямбда-выражения для фильтрации DataRows? - PullRequest
13 голосов
/ 11 августа 2010

Как я могу искать строки в таблице данных для строки с Col1 = "MyValue"

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

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

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

Ответы [ 5 ]

26 голосов
/ 11 августа 2010

Вы можете использовать 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 классе , чтобы упростить безопасный для типов доступ к полю (а также предоставить дополнительные преимущества преобразования DBNull в нулевые аналоги в .NET):

dataSet.Tables[0].AsEnumerable().Single(
    r => r.Field<string>("Col1") == "MyValue");
6 голосов
/ 11 августа 2010

Для этого можно использовать метод Select таблицы данных или свойство Filter 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
}
3 голосов
/ 23 ноября 2013

Вы можете попробовать это:

var b=datatable.AsEnumerable.where(p=> p.Field<string>   
("column_name")=="desire_value").CopyToDataTable()
2 голосов
/ 11 августа 2010

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

  DataRow[] foundRow = ( dataSet.Tables[0].Rows.Select("Col1 = 'MyValue'");
0 голосов
/ 11 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...