76

次のような単純なクエリがある場合:

string sql = "SELECT UniqueString, ID  FROM Table";

そして、それを次のような辞書オブジェクトにマップしたいと思います。

Dictionary<string, int> myDictionary = new Dictionary<string, int>();      

Dapperでこれをどのように行うのですか?

私はそれが次のようなものだと思います:

myDictionary = conn.Query<string, int>(sql, new {  }).ToDictionary();

しかし、適切な構文を理解することはできません。

4

7 に答える 7

122

すでにさまざまな方法が示されています。個人的には、非汎用 API を使用します。

var dict = conn.Query(sql, args).ToDictionary(
    row => (string)row.UniqueString,
    row => (int)row.Id);
于 2013-02-09T08:37:53.503 に答える
20

追加のクラスなしでも動作します:

var myDictionary = conn.Query<string, int, KeyValuePair<string,int>>(sql, (s,i) => new KeyValuePair<string, int>(s,i))
    .ToDictionary(kv => kv.Key, kv => kv.Value);

: Dapper.NET 3.5 バージョンを使用する場合、.NET 4.0 および .NET 4.5 バージョンはオプションの引数を利用するため、1 番目、2 番目、および戻り値の型を取る Query メソッドでは、より多くのパラメーターを指定する必要があります。

この場合、次のコードが機能するはずです。

string splitOn = "TheNameOfTheValueColumn";
var myDictionary = conn.Query<string, int, KeyValuePair<string,int>>(sql, (s,i) => new KeyValuePair<string, int>(s,i), null, null, false, splitOn, null, null)
        .ToDictionary(kv => kv.Key, kv => kv.Value);

ほとんどの引数はデフォルトに戻りますが、splitOnそれ以外の場合は「id」の値にデフォルト設定されるため、必須です。

' ID ' と '説明'の 2 つの列を返すクエリの場合、'説明splitOn'に設定する必要があります。

于 2013-02-08T21:56:16.127 に答える
7

あなたがやろうとしていることが可能かどうかはわかりません。クエリをマップするクラスを定義すると、これははるかに簡単になります。

public class MyRow
{
    public int Id { get; set; }
    public string UniqueString { get; set; }
}

次に、これを行うだけです:

var sql = "SELECT UniqueString, ID  FROM Table";
var myDictionary = conn.Query<MyRow>(sql).ToDictionary(row => row.UniqueString, row => row.Id);
于 2013-02-08T21:15:21.743 に答える
2

実行時に構造がわからないテーブルの場合

    using var db = new SqlConnection(_connectionString);
    var sql = $"Select * From {tableName} Order By {primaryKey}";

    var result = await db.QueryAsync(sql); 
    return result
        .Cast<IDictionary<string, object>>()
        .Select(it => it.ToDictionary(it => it.Key, it => it.Value));
于 2020-11-30T14:40:32.797 に答える