2017-12-04 1 views
1

DapperをORMとして実装しようとしていますが、挿入または更新されたエンティティを返すようにします。これは私が思いついたことです、それはうまく動作しますが、これはデフォルトのクエリとQueryAsyncメソッドを悪用しているのだろうか?CUD操作でクエリやQueryAsyncを使用すると乱用する

public async Task<Models.TestTable> Insert(Models.TestTable inputObject) 
{ 
    IEnumerable<Models.TestTable> output; 

    output = await _connection.QueryAsync<Models.TestTable>(
     sql: string.Format("INSERT INTO TestTable (FirstName, LastName) OUTPUT INSERTED.* VALUES (@FirstName, @LastName)"), 
     param: inputObject); 

    return output.SingleOrDefault(); 
} 

答えて

2

のみ実際の問題私は不要string.Formatあり見ることができます。

は個人的に私ちょうど既存のオブジェクトにId(または何でも)を更新するように誘惑されている場合がありますが、あなたのOUTPUT INSERTED.*はあまりにも正常に動作します。

public async Task<Models.TestTable> Insert(Models.TestTable inputObject) 
    => (await _connection.QueryAsync<Models.TestTable>(
    "INSERT INTO TestTable (FirstName, LastName) OUTPUT INSERTED.* VALUES (@FirstName, @LastName)", 
    inputObject)).SingleOrDefault(); 

それのほとんどがある:私、それは全体の事をインラインで作成することが魅力的になりこと非常にvar output = ...を介してローカル宣言をインラインで移動するために誘惑されるかもしれない、そしてもちろん私はをやった後、トリビアと主観的です。ヘック、string.Formatさえもではなく、という問題ではなく、であることがあります。です。

もう1つ確認してください:私たちは(覚えていないのですが)QuerySingleOrDefaultAsyncメソッドを追加しましたか?私はQuerySingleOrDefaultを追加したことを知っています - 私は*Asyncの双子について覚えていません。

+0

はい、「INSERT INTO {0}(FirstName、LastName)...」のように指定されているため、string.Formatは(誤って)そこにあります。私はちょうどチェックし、はい、あなたは十分な注意を払っていないし、それを逃したQuerySingleOrDefaultAsyncを実装しました。これに答えていただきありがとうございます。 – Iztoksson

+1

@Iztokssonテーブル名を入力する場合は、ホワイトリスト(テーブルが有効で期待されるテーブル名であることを確認してください。予期しない値を許可しないでください) –

関連する問題