C# 无法将“DapperRow”类型的对象强制转换为“System.String”类型

C# 无法将“DapperRow”类型的对象强制转换为“System.String”类型,c#,dapper,C#,Dapper,我正在使用Dapper访问数据库对象 所以这条线 Console.Write(string.Join(System.Environment.NewLine, results)); 给我 {DapperRow, VALUE_A = 'Y', VALUE_B = 'Y'} 但我想访问或打印这些值,如 DapperRow, VALUE_A = 'Y' VALUE_B = 'Y' 但我正在获取System.InvalidCastException:无法使用以下代码将“DapperRow”类型的对

我正在使用Dapper访问数据库对象

所以这条线

Console.Write(string.Join(System.Environment.NewLine, results));
给我

{DapperRow, VALUE_A = 'Y', VALUE_B = 'Y'}
但我想访问或打印这些值,如

DapperRow, 
VALUE_A = 'Y'
VALUE_B = 'Y'
但我正在获取System.InvalidCastException:无法使用以下代码将“DapperRow”类型的对象强制转换为“System.String”类型。在这里,我试图使用foreach循环浏览这个列表

using (var conn = new OracleConnection("Password=xxxxx;Persist Security Info=True;User ID=xxxxx;Data Source=xxxxx"))
{
// dapper adds an extension method to the connection for querying
string sql = "SELECT X, Y FROM Z WHERE ABC = 123";
var results = conn.Query(sql).ToList();
Console.Write(string.Join(System.Environment.NewLine, results));

    foreach (string value in results)
    {
    Console.WriteLine("> {0}",value);
    }
}
引用:

string sql = "SELECT * FROM Invoice WHERE InvoiceID = @InvoiceID; SELECT * FROM InvoiceItem WHERE InvoiceID = @InvoiceID;";

using (var connection = My.ConnectionFactory())
{
    connection.Open();

    using (var multi = connection.QueryMultiple(sql, new {InvoiceID = 1}))
    {
        var invoice = multi.Read<Invoice>().First();
        var invoiceItems = multi.Read<InvoiceItem>().ToList();
    }
}
这意味着您的代码将更改为

        string sql = "SELECT X, Y FROM Z WHERE ABC = @ABC";
        using (var conn = new OracleConnection("Password=xxxxx;Persist Security Info=True;User ID=xxxxx;Data Source=xxxxx"))
        using (var multi = conn.QueryMultiple(sql, new {ABC = 123}))
        {
            var results = multi.Read<Z>().ToList();
            Console.Write(string.Join(System.Environment.NewLine, results.Count));
            foreach (string value in results)
            {
                Console.WriteLine("> X:{0} Y:{1}",value.X, value.Y);
            }
        }

实际上这给了我想要的结果

using (var conn = new OracleConnection("Password=xxxxx;Persist Security Info=True;User ID=xxxxxxx;Data Source=xxxxxx"))
{
string sql = "SELECT X, Y FROM Z WHERE ABC = 123";
var orderDetail = conn.Query(sql).FirstOrDefault();

    foreach (var pair in orderDetail)
    {
        Console.WriteLine("{0} = {1}", pair.Key, pair.Value);
    }
}

Output: 
VALUE_A = 'Y'
VALUE_B = 'Y'
然后用类似的方法,我可以得到返回的值'Y'

if (pair.Key == "VALUE_B")
{
Console.WriteLine("Val {0}", pair.Value);
}

现在已经很晚了,但我刚刚解决了一个类似的问题,我正面临着这个问题,并想与大家分享。 使用Dapper,您可以在查询时将对象转换为所需的类型。所以写一个属性为X,Y的类

class DataReturned
{
public string X {get; set;}
public string Y {get; set;}
}
那么当你这么做的时候

var results = conn.Query<DataReturned>(sql).ToList();
这将删除DapperRow,并提供您可以使用的列表。 如果您只希望将一个值转换为基元类型,则可能不需要该类

var results = conn.Query<string>(sql).ToList();

我确信您甚至可以强制转换为字符串数组、字典或任何其他类型,只是还没有尝试过。

也许我问错了问题,但在sql工具中该查询返回什么?IE的数据类型是什么?我没有像您使用的那样使用Dapper,但通常会绑定到一个对象而不发出sql工具中,我得到一行两列,其中“VALUE_A”和“VALUE_B”是标题,“Y”是值。当您有一个类Foo{public string X;public string Y;}时会发生什么?然后执行conn.QueryMultiple…Read.ToList;
var results = conn.Query<string>(sql).ToList();