我正在使用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);
}
}
答案 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();
确保您甚至都可以尝试将其转换为字符串数组,字典或任何其他类型。