2016-01-19 102 views
17

我想选择2个整数列的列表将结果映射到一个元组。只是作为一个例子:我可以将结果映射到Dapper中的Tuple吗?

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

不工作,但如果我创建了一个类有两个整数,例如相同的查询确实工作:

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

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

我的选择是不是要创造一些假上课只是为了获得一些数据。在这种情况下,它是两个整数列,但还有其他用例可以想到。

编辑 - 答: 这是为我工作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

谢谢虚空雷,我得到它的工作,并把我的答案上面(编辑移动答案) –

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>>告诉短小精悍会有两个整数那将返回的元组

* 2 =告诉hardy中使用元组返回结果

* 3 =告诉hardy中该返回的每个字段用于返回一个结果为元组的每个属性。

* 4 = Dapper扩展方法将Dapper的内部结果投射到List;默认情况下,Dapper会在封面下返回一个列表,这样转换速度比复制到新列表要快。

+0

由于地铁蓝精灵。这是我不知道的一个很酷的功能,可能是更好的方法。我接受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

这个工作从C#7开始这是一个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(); 
}  

使用方法

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

确保你已经安装了Dapper 1.50 .4或更高版本。

+0

一定要更新到1.50.4 – JasonCoder

+0

@JasonCoder这是什么版本?您只需要最新版本的Visual Studio 2017 – Rubanov

+0

Rubanov:在Dapper 1.50.4之前,我只能得到具有默认值的值元组。 VS 2017在.net 4.7项目 – JasonCoder

相关问题