В С#, как лучше всего проверить, пуст ли набор данных?

Я знаю, что вы можете посмотреть на row.count или table.count, но есть ли другие способы узнать, пуст ли набор данных?


person RTipton    schedule 06.09.2008    source источник


Ответы (6)


Я бы предложил что-то вроде: -

  bool nonEmptyDataSet = dataSet != null && 
    (from DataTable t in dataSet.Tables where t.Rows.Count > 0 select t).Any();

Правки: я значительно подчистил код после должного рассмотрения, я думаю, что он стал намного чище. Большое спасибо Киту за вдохновение относительно использования .Any().

В соответствии с предложением Кейта, вот версия метода расширения этого подхода: -

public static class ExtensionMethods {
  public static bool IsEmpty(this DataSet dataSet) {
    return dataSet == null ||
      !(from DataTable t in dataSet.Tables where t.Rows.Count > 0 select t).Any();
    }
  }

Обратите внимание, как правильно поправил меня Кит в комментариях к своему сообщению, этот метод будет работать, даже если набор данных равен нулю.

person Community    schedule 06.09.2008
comment
Ой. Я редактировал это слишком много раз, я думаю... теперь это сообщение сообщества! Ну что ж. :-) - person ljs; 08.09.2008

Что случилось с

(aDataSet.Tables.Count == 0)

?

person Joe Ratzer    schedule 06.09.2008
comment
кажется, что автор определяет пустой набор данных как набор данных без таблиц или с любым количеством пустых таблиц. - person vitule; 27.08.2009
comment
Если вы посмотрите на исходный пост (нажмите на ссылку редактирования), вы увидите, что или таблицы.счет был добавлен. До этого изменения мой вопрос был разумным... - person Joe Ratzer; 27.08.2009
comment
Проблема с этим заключается в том, что с 2013 года ASP.NET 4.0 заключается в том, что набор данных может быть нулевым, и в этом случае проверка завершается сбоем. - person philw; 07.06.2013
comment
Хороший вопрос, но вопрос в том, чтобы проверить, является ли набор данных пустым, а не нулевым. Если вы считаете, что это лучший ответ, я добавлю нулевую проверку? - person Joe Ratzer; 07.06.2013

Я создал небольшой статический класс использования только для этой цели.

Код ниже должен читаться как английское предложение.

    public static bool DataSetIsEmpty(DataSet ds)
    {
        return !DataTableExists(ds) && !DataRowExists(ds.Tables[0].Rows);
    }

    public static bool DataTableExists(DataSet ds)
    {
        return ds.Tables != null && ds.Tables.Count > 0;
    }

    public static bool DataRowExists(DataRowCollection rows)
    {
        return rows != null && rows.Count > 0;
    }

Я бы просто поместил что-то вроде кода ниже и покончил с этим. Написание читабельного кода имеет значение.

        if (DataAccessUtil.DataSetIsEmpty(ds)) {
            return null;
        }
person dance2die    schedule 07.09.2008

Я думаю, что это то место, где вы могли бы использовать метод расширения в C# 3 для улучшения удобочитаемости.

Используя идею Кроноза...

public static bool IsNotEmpty ( this dataset ) 
{
    return dataSet != null && (
        from DataTable t in dataSet.Tables 
        where t.Rows.AsQueryable().Any()
        select t).AsQueryable().Any();
}

//then the check would be
DataSet ds = /* get data */;

ds.IsNotEmpty();

Из-за того, что методы расширения всегда расширяются компилятором, это будет работать даже в том случае, если проверяемый набор данных равен нулю.

Во время компиляции это изменяется:

ds.IsNotEmpty();

//becomes

DataSetExtensions.IsNotEmpty( ds );
person Keith    schedule 07.09.2008
comment
Это хорошая идея, хотя, если быть педантичным, строка t.Rows.Any() не будет компилироваться, поскольку dataSet.Tables.Rows — это DataRowCollection, которая не реализует IEnumerable‹T›, поэтому .Any() недоступен. - person ljs; 07.09.2008
comment
О, и извините за еще более ужасную критику, но метод расширения не будет работать, когда набор данных равен нулю, скорее будет возбуждено исключение NullReferenceException. Вдобавок IsEmpty() возвращает противоположное тому, что должно, — указывает, не ли оно пусто!! - person ljs; 07.09.2008
comment
А, я этого не знал. Это очень круто, спасибо за разъяснение :-) - person ljs; 08.09.2008

Чтобы было ясно, вам сначала нужно просмотреть все таблицы данных, а затем посмотреть количество строк для каждой таблицы данных.

person Portman    schedule 06.09.2008

person    schedule
comment
Это хорошая идея, чтобы выполнить литье, а затем вручную проверить все строки таким образом? - person Kache; 11.10.2012