2017-09-03 17 views
0

クエリを実行した後に要素がない場合、null値を返そうとしていますが、DefaultIfEmpty()メソッドを使用していますが、スローされる:スローCopyToDataTable()を使用してnull値を返す方法LINQ拡張メソッド

例外: の 'System.InvalidOperationExceptionが' System.Data.DataSetExtensions.dll

追加情報:ソースが がNULLであることのDataRowの参照が含まれています。

私のコード:

DataTable filtered = dt.AsEnumerable() 
         .Where(x => x.Field<string>("SLA") == "Valid" 
            && x.Field<string>("Status") == "Finished") 
         .Select(y => y) 
         .DefaultIfEmpty() 
         .CopyToDataTable(); 

私はfilteredデータテーブルにnull値を返すことができますどのように?あなたが望むよう

+0

あなたがトライキャッチを使用できますか? – Youssef13

+1

これは役立ちます:[行がないときにCopyToDataTable()を処理する方法](https://stackoverflow.com/questions/7815916/how-to-handle-copytodatatable-when-no-rows) –

+0

@ Youssef13私は好きですリソース効率のtry-catchブロックを避ける – jonathana

答えて

0

DefaultIfEmptyはデフォルトvalue'd項目としませnullで初期化されたコレクションを返します。シーケンス場合

はシングルトンコレクションに指定されたシーケンスまたは型パラメータのデフォルト値の要素を返します。空です。あなたの代わりに何ができるか

アイテムの量がちょうどチェックされています

DataTable filtered = dt.AsEnumerable() 
         .Where(x => x.Field<string>("SLA") == "Valid" 
            && x.Field<string>("Status") == "Finished") 
         .Select(y => y) 
         .CopyToDataTable(); 

if(filtered.Rows.Count == 0) 
{ 
    filtered = null; 
} 

またはそれ以上:

var collection = dt.AsEnumerable() 
        .Where(x => x.Field<string>("SLA") == "Valid" 
           && x.Field<string>("Status") == "Finished") 
        .Select(y => y); 
DataTable filtered = collection.Any() ? collection.CopyToDataTable() : null; 
+0

ありがとう、2番目のオプションは答えです、私は最初のオプションは、nullと仮定するため、まだ例外をスローすると思います。 – jonathana

+1

@jonathana - 私はまた、2番目の方が良いと思っていますが、最初は空ではなく空であるので、投げません –

+1

私はdownvotersが説明したいと思います.. –

関連する問題