2016-01-19 24 views
17

2つの整数列のリストを選択しようとしていますが、結果をタプルにマップしています。結果をDapperのタプルにマップできますか?

return connection.Query<BogusClass>("select id1, id2 from sometable").ToList(); 

public class BogusClass{ 
public int id1 {get;set;} 
public int id2 {get;set;} 
} 

私の好みは、いくつかの偽を作成する必要がないことである:ちょうど例として:私のような二つの整数を持つクラスを作成する場合

return connection.Query<Tuple<int,int>>("select id1, id2 from sometable").ToList(); 

は動作しませんが、同じクエリが動作しませんいくつかのデータを処理するためのクラスです。この場合、それは2つの整数列ですが、私が考えることができる他のユースケースがあります。

編集 - 回答: これはHTH

が変更私のために働いた構文は次のとおりです。

return connection.Query<Tuple<int,int>>("select id1, id2 from sometable").ToList(); 

へ:ここ

return connection.Query<int, int, Tuple<int, int>>("select id1, id2 from sometable", Tuple.Create, splitOn: "*").ToList(); 

答えて

17

実施例である:

public class DapperTests 
{ 
    [Test] 
    public void TuppleTest() 
    { 
     var conn = new SqlConnection(@"Data Source=.\sqlexpress; Integrated Security=true; Initial Catalog=mydb"); 
     conn.Open(); 

     var result = conn.Query<int, int, Tuple<int, int>>(
      "select 1,2 union all select 4,5", Tuple.Create, splitOn: "*").ToList(); 

     conn.Close(); 

     Assert.That(result.Count, Is.EqualTo(2)); 
    } 
} 

さらに多くの例が見つかりますhere

+0

ありがとうございましたVoid Ray、私はそれを働かせて、上記の答えを入れました(答えを編集するように編集されました) –

9

タプルは一つの選択肢である私はつまり、クラスを作成したくない時はいつでも、私は

string sql = "Select 'f' as Foo, 'b' as Bar"; 

var result = connection.Query<dynamic>(sql).Single(); 

string foo = result.Foo; 
string bar = result.Bar 

、ダイナミックな結果を使用して好むフィールドの名前は、結果から返されたダイナミックの名前になりますプロパティ。あなたのケースでは

、あなたはとてもタプルがより適切であろう、単一の変数に代入リストを返すとしないように欠けている:

string sql = "select id1, id2 from sometable"; 

List<Tuple<int, int>> result = conn.Query<int, int, Tuple<int, int>>(// *1 
    sql, 
    Tuple.Create, // *2 
    splitOn: "*") // *3 
    .AsList(); // *4 

* 1 = <int,int, Tuple<int, int>>は、その二つの整数が存在することをDapperの告げますタプルに

* 2を返します=は=は、すべてのフィールドが返されることDapperの告げる

* 3の結果を返すためにタプルを使用するDapperの伝えタプルの各プロパティの結果を返すために使用されます。

* 4 = Dapperの内部結果をListにキャストするためのDapper拡張方法。デフォルトでは、Dapperはカバーの下にリストを返しますので、キャストは新しいリストにコピーするよりも速くなります。

+0

ありがとうMetro Smurf。これは私が知りませんでした、そしておそらくよりよいアプローチです。私はそれが技術的に私が尋ねた質問への答えであるので、私はVoid Rayの答えを受け入れています。 –

6

あなたが好きなことができますので

string query = "Select value1 as Item1,value2 as Item2 from #sometable"; 
var data = db.Query<Tuple<int,int>>(query); 
+1

Item1、Item2 ...、それは答えです!どうも! – MrHIDEn

4

これはこれは、あなたがDapperの1.50インストールされていることを確認してください方法

var item = GetItem(123); 
Console.WriteLine($"The publish date of item [{item.Id}] is [{item.PublishDate.Value}]"); 

を使用してValue Tuple

public (int Id, DateTime? PublishDate) GetItem(string id) 
{ 
    const string sqlCommand = "select top 1 Id, PublishDate from Item where Id = @id"; 

    return _connection.Query<(int, DateTime?)>(sqlCommand, new { id }).FirstOrDefault(); 
}  

であるC#7から始まる作品.4以降。

+0

必ず1.50.4に更新してください。 – JasonCoder

+0

@JasonCoderどのバージョンですか? Visual Studioの最新バージョンが必要です。2017 – Rubanov

+0

Rubanov:Dapper 1.50.4より前のバージョンでは、既定値の値タプルだけが得られます。 NET 4.7のプロジェクトのVS 2017 – JasonCoder

関連する問題