2017-01-04 8 views
0

C#では、1つのステートメントでSqlDataRecordをインスタンス化して初期化する方法はありますか?1つのステートメントでSqlDataRecordをインスタンス化して初期化できますか?

代わりの二つの文でこれを行う:

var record = new SqlDataRecord(new SqlMetaData("n", SqlDbType.BigInt)); 
record.SetInt64(0, someLongVal); 

私は1つの文の代わりに、2でそれをやってみたいです。それは可能ですか?

編集:私はこれを行うための簡略化された方法を望んでいます。このコードは今、Linqステートメントに入れたいループにあります。しかし、私はそれをLinqに変換すると、インスタンス化し、値を設定し、返す3行のラムダの外観が気に入らない。だから私は代替案を探しています。純粋に美的。

+0

なぜ2つのステートメントを使いたくないのですか? – Servy

+1

これを1つのステートメントにすると、コードが読みにくくなります。 – Amy

+0

'someLongVal'を受け取り、新しいSqlDataRecordを吐き出す独自のルーチンに2つのステートメントをラップしないのはなぜですか?拡張機能と同じくらいクールではないかもしれませんが、可読性のためにその呼び出しを1行に減らすだけであれば、ルーチンが動作する可能性があります。 – Carson

答えて

4

拡張子が「?」のメソッドチェインを使用できます。

public static class DataRecordExtension 
{ 
    public static SqlDataRecord WithInt64(this SqlDataRecord record, int ordinal, long value) 
    { 
     record.SetInt64(ordinal, value); 
     return record; 
    } 
} 

...そしてそのようにそれを使用します。

var record = new SqlDataRecord(new SqlMetaData("n", SqlDbType.BigInt)).WithInt64(0, someValue); 

またはあなたのニーズのためのヘルパーを構築....

public class DataRecordHelper 
{ 
    public static SqlDataRecord CreateDataRecordInt64(int ordinal, long value, params SqlMetaData[] metaData) 
    { 
     var record = new SqlDataRecord(metaData); 
     record.SetInt64(ordinal, value); 
     return record; 
    } 
} 
+0

lol、賢明な回避策 –

+0

単にメソッドを作成するのであれば、賢明に設計された何かを使用し、 'SqlDataRecord'を作成して設定するメソッドを記述してやってください。 – Servy

+0

@Steveなぜですか?質問の要件を満たすより賢明なものではなく、本当に混乱して誤解を招くようなデザインを回答に使用する理由について、著者に質問することは合理的です。 – Servy

3

あなたは、単一の操作をしたい場合これらの複数の操作を実行するメソッドを作成します。したがって、初期化されたSqlDataRecordを作成する操作が必要な場合は、初期化されたSqlDataRecordを作成するメソッドを作成します。

public static SqlDataRecord CreateDataRecord(long value) 
{ 
    var record = new SqlDataRecord(new SqlMetaData("n", SqlDbType.BigInt)); 
    record.SetInt64(0, value); 
    return record; 
} 
+0

あなたは速すぎて、私の答えを編集:) –

関連する問題