DapperでDynamicParametersのコンテンツを取得する

c# dapper reflection

質問

OracleからMySQLへデータベースを移行しています。 OracleとMySQLは、バインド変数@:異なる文字を使用します。 Dapperを使用してデータベースを照会しています。 DynamicParametersをDapperに渡し、バインド変数が機能します。

私ができるようにしたいのはDynamicParametersを見て、値の名前を見て、正面の文字を変更してからSQL文字列に置き換えます。私はこれをどうやってやるのか知っています。

私が持っている問題は、DynamicParametersを列挙してキーと値を取得できないということです。

私の考えは<string, DynamicParameters.ParamInfo> parametersを使用して、実行時にprivate <string, DynamicParameters.ParamInfo> parametersフィールドを取得しようとすることです。 DynamicParameters.ParamInfoがプライベートクラスであるため、 DynamicParameters.ParamInfo動作させる方法を考えることができません。

私が何をすることができるかについてのアイデアは何ですか?

受け入れられた回答

最初に質問する部分は2つあります。

私ができることを望むのは、DynamicParametersを通り、値の名前を見て、正面の文字を変更することです

2番目は:

それをSQL文字列に置き換えます

最初の部分はDapperがどれくらいスマートであるかを知りたいと思った。 DynamicParameters渡された引数を処理することは十分にスマートであることが証明されています。あなたは以下を持っていると考えてください:

// Source of the DynamicParameters
var args = new Dictionary<string,string>();
args.Add("@emailPromotion", "1");
// additional args goes here

// An example of how you build a DynamicParameters
var dbArgs = new DynamicParameters();
foreach (var pair in args) dbArgs.Add(pair.Key, pair.Value);

// The query - using SQL Server (AdventureWorks)
var sql = "select * from Person.Contact WHERE EmailPromotion = @EmailPromotion";

// The Dapper call (this works as expected)
var items = the_connection.Query<dynamic>(sql, dbArgs);    

colonを使用してOracleから移行し、このソースからDynamicParametersを渡したとします。

var oracle_args = new Dictionary<string,string>();
oracle_args.Add(":emailPromotion", "1");

以前に与えられたコードの残りの部分でoracle_argsを使用すると、それは引き続き機能します。 SQL Serverがコロンを理解できなかったので、それは期待できません。エラーの原因となるのは、クエリ自体( var sql )に無効な文字( colon )が含まれている場合のみです。

どのようにあなたの質問に関連して?これは、「 最初の部分 」について心配する必要がなく、Dapperに仕事をさせることを意味します。 「 第2の部分 」の世話をして、あなたの(SQL)クエリを調整するだけです。そして、あなたが問合せを完全に管理しているなら、それはあなたに何の問題も与えてはなりません。単純な文字列置換はそのトリックを行います。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ