2008-09-06 15 views

答えて

17

私のようなものを示唆している: -

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

注意、キースは当然彼のポストのコメントで私を修正して、この方法は、場合でも動作しますデータセットはnullです。

+0

私はこれをあまりにも何度も編集しました...今はコミュニティの投稿です!しかたがない。 :-) – ljs

5

(aDataSet.Tables.Count == 0)

と何が問題なのですか?

+0

著者がいないテーブルでまたは空のテーブルの任意の数のデータセットとして「空のデータセット」を定義しているようです。 – vitule

+0

元の投稿を見ると(編集リンクをクリック)、「またはtables.count」が追加されていることがわかります。その変更に先立って、私の質問は合理的でした... –

+0

それは、2013年のASP.NET 4.0では、dataSetがnullの場合がありますが、その場合はチェックがクラッシュすることがあります – philw

0

明らかにするには、すべてのDataTableを確認し、各DataTableの行数を確認する必要があります。

3

私は英語の文のように読むべきコードの下にその目的

のために小さな静的utilのクラスを作成しました。

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

これは、読みやすさを向上させるためにC#3の拡張メソッドを使用できる場所だと思います。拡張メソッドは常にチェックされているデータセットがnullの場合、これはでも動作するコンパイラによって展開されているという事実に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(); 

は、コンパイル時にこれが変更されます。

ds.IsNotEmpty(); 

//becomes 

DataSetExtensions.IsNotEmpty(ds); 
+0

これは良いアイデアですが、ペダンティックであるために、t.Rows.Any()の行はdataSet.Tables.Rowsがコンパイルされないため、IEnumerable を実装していないDataRowCollectionです。Any()は使用できません。 – ljs

+0

ああ、ひどく重大なことには申し訳ありませんが、データセットがnullの場合は拡張メソッドが機能しません。むしろNullReferenceExceptionが発生します。さらに、IsEmpty()は、それが必要とするものとは逆の結果を返しています - 空でないかどうかを示します。 – ljs

+0

フィードバックいただきありがとうございます。しかし、それはnullsで動作します。 – 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

キャストし、そのようなすべての行を介して "手動で"チェックすることをお勧めしますか? – Kache

関連する問題