2016-06-14 21 views
1

次のクエリを実行しようとしましたが、エラーが発生しました。Dapper sqlクエリ内部結合リスト<string>

conn.Query("select d.ID, d.CategoryID from Document d inner join @Cases c on d.CaseID = c.ID", new { Cases = new List<string> { "000-6575-101", "5902-205" }}); 

私はIncorrect syntax near ','.

私の質問がある受け取るコマンドを実行して、私がやっているもののように何かをすることも可能ですか?

+0

INNER JOINの後にテーブル名が必要です。値のリストを表すパラメータがあります。あなたは、テーブルを定義するためのパラメータを使用することはできませんと述べた。 Documentと結合したいテーブルは何ですか? – Steve

+0

@Steve "テーブルを定義するためのパラメータは使用できません" - できれば "テーブル値のパラメータ"など –

答えて

4

Dapperのサポートこのシナリオのin構文:

var ids = new List<string> { "000-6575-101", "5902-205" }; 
conn.Query("select d.ID, d.CategoryID from Document d where d.CaseID in @ids", new { ids}); 

これは、Dapperのは、実際にあなたが(完全にパラメータを維持しながら、など)やりたいあなたのクエリを変更しますいくつかのケースの一つです。

また、サポート(必要に応じて、SqlMapper.Settingsを参照してください):

  • パラメータパディングクエリプランのキャッシュの飽和を減らすために
  • 整数型に対するSQL 2016のstring_splitの使用(List<int>など)
+0

** ids **の数が多い場合はどうなりますか? 200としましょう、それは問題を引き起こすでしょうか? – Mayank

+0

これは、次のクエリに変換されます。** N'select d.ID、ドキュメントdのd.CategoryID d.CaseID in(@ Cases1、@ Cases2) '、N' @ Cases1 nvarchar(4000)、@ Cases2 nvarchar(4000 ) '、@ Cases1 = N'000-6575-101'、@ Cases2 = N'5902-205 '。**パラメータ**はntext **ですか? – Mayank

+0

@MayankもしあなたがTVPを使いたいのであれば、Dapperはそれを使って 'DataTable'(私は' DataTable'の大ファンではありませんが、 'SqlClient'はそれをサポートしています)を使ってOKです。私の経験からは、このシナリオでは「入」がうまくいくようです。パラメータパディングは、201、201、203などのパラメータ(パディングによる)を持つことによる問題の回避に役立ちます。もしあなたがansi/unicodeを制御したいのであれば:dapperの 'DbString'はそれを達成します –

関連する問題