2012-02-18 11 views
4

dapperを使用しているときに次のコードが正しい順序で取得されない理由はありますか?Dapper Order By

connection.Query<User>("SELECT id, name " + 
         "FROM user " + 
         "ORDER BY @sort @dir " + 
         "LIMIT @offset, @pageSize; ", 
         new { 
          sort = sortOrder, // sortOrder = "name" 
          dir = sortDirection, // sortDirection = "ASC" 
          offset = pageIndex * pageSize, // offset = 0 
          pageSize = pageSize // pageSize = 10 
         }); 

注文を行わずに常に返されます。

私はちょうどこの

"SELECT id, name " + 
"FROM user " + 
"ORDER BY " + sortOrder + " " + sortDirection + " " + 
"LIMIT @offset, @pageSize; " 

のように直接文字列にはsortOrderとsortDirectionを置くことができるが、私はそれはそれ自身のクエリプランのキャッシュを持っていると信じてので、それがDapperのに影響するかどうかはわかりません。

また、dapperによって生成されたクエリを表示する方法はありますか?

答えて

6

もちろん、データベースエンジンでは列名をパラメータ化できません。だから、例えば:

var row = cnn.Query("select @bob as col from table", new {bob = "col"}).first(); 
// most likely returns "row.col == col" 

あなたは私がインライン置換を使用することをお勧めします句によって順序をパラメータしようとしている、あなたのエスケープを保証することができます提供し、ボビー・テーブルは常に潜んされます。 (どちらかまたはあなたがprocを使用することができます)

(MySQL?Oracle?)のプロファイラーの状況についてはわかりませんが、MiniProfilerのようなツールを使用してSQLを見ることができます。

キャッシュには影響しますが、影響が最小限になるようにsortOrderとsortDirectionの順列はわずかです。

+0

お返事ありがとうございました! – JesseBuesking