【问题标题】:how to return tuple of primitive data types in dapper如何在 dapper 中返回原始数据类型的元组
【发布时间】:2019-09-12 15:29:01
【问题描述】:

我一直在我的一个项目中使用 dapper,在一种情况下,我想返回一个原始数据类型的元组。 (只有一行)由于我使用了 dapper,我真的很想在这种情况下也使用 dapper。我检查了这些链接,但找不到解决方案

Can I map a result to Tuple in Dapper?

Dapper multiple objects from one row

Using Dapper to map more than 5 types

这就是我的代码的样子,

Using(_dbTransaction = _dbConnection.BeginTransaction()){

     var command = new CommandDefinition(
                "SELECT ID1,ID2 " +
                "FROM table " +
                "WHERE ID0 = @ID",
                new {ID = 34},_dbTransaction); //34 is just a number

    var dataSet   = _dbConnection.QueryFirst<Tuple<uint, decimal>>(command);

    //assign the retrieved values to properties of orderItem (orderItem is a passed object as a parameter)
    orderItem.Id = dataSet.item1;
    orderItem.ContainerPrice = dataSet.item2; 

}

但这会产生异常

{"System.Tuple`2[[System.UInt32, mscorlib, Version=4.0.0.0, Culture=neutral, 需要一个无参数的默认构造函数或一个匹配的签名(System.UInt32 Id, System.Decimal ContainerPrice), PublicKeyToken=b77a5c561934e089],[System.Decimal, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 物化"}

如果可以提出方法或指出我哪里出错了,那将是一个很大的帮助

【问题讨论】:

  • 从抛出的错误代码...听起来您需要提供默认方法签名。然后该方法的参数化版本应该可以工作......给定您的逻辑检查
  • @Chef_Code 你的意思是默认方法签名吗?是 QueryFirstOrDefault() 吗?
  • 这是我首先要消除的。提供默认签名...然后从那里开始。是的,QueryFirstOrDefault&lt;&gt;() 或者你使用的方法QueryFirst&lt;Tuple&lt;uint, decimal&gt;&gt;() 没有参数。你仍然可以使用你的重载版本......默认的只是需要可用
  • var悬停在command前面...编译器是否认为commandTuple&lt;uint, decimal&gt;&gt;
  • 是的,dataSet(var) 是一个元组。而且我也尝试了 QueryFirstOrDefault() 方法,但它也不能正常工作

标签: c# mysql dapper


【解决方案1】:

如果你想使用元组,你可以试试这个:

    [Test]
    public void TupleTest()
    {
        var result = _connection.Query<int, decimal, Tuple<int, decimal>>
            ("select 1 as Id, 12.99 as ContainerPrice", Tuple.Create, splitOn: "*")
            .FirstOrDefault();

        Assert.That(result.Item1, Is.EqualTo(1));
        Assert.That(result.Item2, Is.EqualTo(12.99));
    }

您也可以避免使用元组,并使用动态:

    [Test]
    public void DynamicTest()
    {
        var result = _connection.Query<dynamic>
            ("select 1 as Id, 12.99 as ContainerPrice")
            .FirstOrDefault();

        Assert.That(result.Id, Is.EqualTo(1));
        Assert.That(result.ContainerPrice, Is.EqualTo(12.99));
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多