




Что случилось с
(aDataSet.Tables.Count == 0)
?
Если вы посмотрите исходный пост (щелкните ссылку редактирования), вы увидите, что был добавлен «or tables.count». До этого изменения мой вопрос был разумным ...
Проблема заключается в том, что с 2013 ASP.NET 4.0 заключается в том, что dataSet может иметь значение null, и в этом случае проверка завершается с ошибкой.
Хороший момент, но вопрос заключается в том, чтобы проверить, является ли набор данных пустым, а не нулевым. Если вы думаете, что это лучший ответ, я добавлю нулевую проверку?
Чтобы было ясно, вам сначала нужно просмотреть все DataTables, а затем посмотреть количество строк для каждой DataTable.
Я бы предложил что-то вроде: -
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();
}
}
Обратите внимание, как Кейт правильно поправил меня в комментариях к своему сообщению, этот метод будет работать, даже если набор данных равен нулю.
Ой. Думаю, я редактировал это слишком много раз ... теперь это сообщение сообщества! Ну что ж. :-)
Я создал небольшой статический класс утилиты только для этой цели.
Код ниже должен читаться как предложение на английском языке.
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;
}
Я думаю, что это место, где вы могли бы использовать метод расширения в 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();
Из-за того, что методы расширения всегда расширяются компилятором, это будет работать даже в том случае, если проверяемый набор данных имеет значение NULL.
Во время компиляции это изменяется:
ds.IsNotEmpty();
//becomes
DataSetExtensions.IsNotEmpty( ds );
Это хорошая идея, хотя, чтобы быть педантичным, строка t.Rows.Any () не будет компилироваться, поскольку dataSet.Tables.Rows - это DataRowCollection, которая не реализует IEnumerable <T>, поэтому .Any () недоступен.
О, и извините, что это еще более ужасно критично, но метод расширения не будет работать, когда набор данных равен нулю, скорее будет вызвано исключение NullReferenceException. Вдобавок IsEmpty () возвращает противоположное тому, что должно - указывает, пусто ли оно в нет !!
Ах, я этого не знал. Это очень круто, спасибо, что прояснили это :-)
#region Extension methods
public static class ExtensionMethods
{
public static bool IsEmpty(this DataSet dataSet)
{
return dataSet == null || dataSet.Tables.Count == 0 || !dataSet.Tables.Cast<DataTable>().Any(i => i.Rows.Count > 0);
}
}
#endregion
Это хорошая идея - выполнить приведение, а затем «вручную» проверить все такие строки?
кажется, что автор определяет «пустой набор данных» как набор данных без таблиц или с любым количеством пустых таблиц.