クエリーオブジェクトによるintger値の返す方法

c# dapper

質問

以下のメソッドでは、ストアドプロシージャによって返されるintgerを返そうとしていますが、0または0以上の値を返します。私の理解では、データが返ってくると、それは辞書(確かではない)になります。どこで整数を返そうとしていますか。どのように私はそれを達成することができます。以下のコードは不完全で、コメントのコードは私が最初にやったことであり、私は同じコードを簡単な方法で書き直すことができることに気付きました。私はそこに両方を残したので、誰かが私に感謝することができない間違っている。

public int Exists(string plan)
{
    using (var connection = new SqlConnection(Connection))
    {
        connection.Open();
       var parameters = new DynamicParameters();
       //parameters.Add("@Plan", plan, DbType.String,
           //ParameterDirection.Input, null);
           //I guess I can directly pass param but not sure how ??

        var data=connection.Query("storeProcmem_Plan", new{ ? ?},
               CommandType.StoredProcedure);

        //how to return an integer               
        int myvalue= data ???                


        connection.Close();
        return Convert.ToInt32(data);

エキスパート回答

あなたのパラメータが固定されていると仮定します(通常はストアドプロシージャのためのものです - 複雑な柔軟性の高いクエリに合うようにSQLを生成する場合、 DynamicParametersが必要な主な時間です) - パラメータのアスペクトは次のように簡単です:

new { Plan = plan }

これは、コンパイラの匿名型機能を使用して、パラメータの名前をPlan 、型string 、変数planから取得する必要があることを定義します。

ストアド・プロシージャが結果をselectすると仮定すると(別々にコーディングする必要のあるreturnではなく)、結果を一番簡単に読み取ることができます。

var myvalue = connection.Query<int>("storeProcmem_Plan", new { Plan = plan },
           CommandType.StoredProcedure).First();

一般的なAPIと非汎用APIは、型付き結果とdynamic結果の間で切り替わります。どちらも用途を持ちますが、ここでは<int>が適切です。 .First()から翻訳標準LINQ操作でIEnumerable<T>T最初の値を選ぶ(一つもなかった場合は例外をスロー)で-あなたはまた、使用することができSingle() FirstOrDefault()またはをSingleOrDefault()は、正確なセマンティクスに依存します。

完全性を保つために 、非ジェネリックAPIを使用していた場合は、列名を知る必要があります。基本的には次のようになります。

dynamic row = connection.Query("storeProcmem_Plan", new { Plan = plan },
       CommandType.StoredProcedure).First();
int myvalue = row.ColumnName;


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow