2008-09-06 24 views

Respuesta

17

Yo sugeriría algo así como: -

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

ediciones: He limpiado de forma significativa el código después de la debida consideración, creo que esto es mucho más limpio. Muchas gracias a Keith por la inspiración con respecto al uso de .Any().

En línea con la sugerencia de Keith, aquí es una versión método de extensión de este enfoque: -

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(); 
    } 
    } 

Nota, como Keith razón, me corrigió en en los comentarios de su puesto, este método funcionará incluso cuando el el conjunto de datos es nulo.

+0

Ouch. Edité esto muchas veces, creo ... ¡ahora es una publicación de la comunidad! Oh bien. :-) – ljs

5

¿Qué hay de malo en

(aDataSet.Tables.Count == 0)

?

+0

parece que el autor define como "conjunto de datos vacío" como conjunto de datos sin mesas o con cualquier número de mesas vacías. – vitule

+0

Si miras la publicación original (haz clic en el enlace editar) verás que se agregó "o tables.count". Antes de ese cambio, mi pregunta era sensata ... –

+0

El problema con eso es que a partir de 2013 ASP.NET 4.0 es que el conjunto de datos puede ser nulo en cuyo caso ese control se bloquea – philw

0

Para que quede claro, primero debe mirar todas las tablas de datos, y luego ver el recuento de filas para cada DataTable.

3

He creado una pequeña clase util estática sólo para ese fin

A continuación código debe leer como una sentencia de Inglés.

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; 
    } 

Pondré algo así como el código siguiente y listo. Escribir un código legible cuenta.

 if (DataAccessUtil.DataSetIsEmpty(ds)) { 
      return null; 
     } 
2

creo que este es un lugar donde se puede utilizar un método de extensión en C# 3 para mejorar la legibilidad.

Usando la idea de Kronoz ...

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(); 

Debido al hecho de que los métodos de extensión siempre se expanden por el compilador de este va a trabajar incluso si el conjunto de datos que se comprueba es nulo.

En este tiempo de compilación se cambia:

ds.IsNotEmpty(); 

//becomes 

DataSetExtensions.IsNotEmpty(ds); 
+0

Es una buena idea, aunque para ser pedante, la línea t.Rows.Any() no se compilará ya que dataSet.Tables.Rows es un DataRowCollection que no implementa IEnumerable .Any() no está disponible. – ljs

+0

Ah, y lo siento por ser aún más terriblemente crítico, pero el método de extensión no funcionará cuando el conjunto de datos sea nulo, sino que se generará una NullReferenceException. Además, IsEmpty() devuelve lo contrario de lo que debería: ¡indica si está * no * vacío! – ljs

+0

Gracias por los comentarios. Sin embargo, funcionará con nulos. – Keith

0
#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 
+0

¿Es una buena idea lanzar y luego "manualmente" revisar todas las filas de esa manera? – Kache

Cuestiones relacionadas