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

时间:2018-07-06 10:45:09

标签: 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”的对象转换为类型为“ 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);
    }
}

3 个答案:

答案 0 :(得分:1)

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

using (var conn = new OracleConnection("Password=dev2g0;Persist Security Info=True;User ID=A$FastEq_Apu;Data Source=repltirt"))
{
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);
}

答案 1 :(得分:0)

引用the manual作为参考:

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);
            }
        }

答案 2 :(得分:0)

这很晚了,但我刚刚解决了我面临并想分享的类似问题。 使用Dapper,可以在Query上将对象转换为所需的类型。因此,编写一个具有X,Y属性的类

class DataReturned
{
public string X {get; set;}
public string Y {get; set;}
}

然后在查询时执行此操作

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

代替此

var results = conn.Query(sql).ToList();

这将删除DapperRow并仅列出您可以使用的列表。 如果只需要将一个值转换为原始类型,则可能不需要该类

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

确保您甚至都可以尝试将其转换为字符串数组,字典或任何其他类型。