25

I am pulling in a Dapper FastExpando object and want to be able to reference the column names dynamically at run time rather than at design/compile time. So I want to be able to do the following:

var testdata = conn.Query("select * from Ride Where RiderNum = 21457");

I want to be able to do the following:

foreach( var row in testdata) {
    var Value = row["PropertyA"];
}

I understand that I can do:

var Value = row.PropertyA;

but I can't do that since the name of the property i'm going to need won't be known until runtime.

The answer from this SO Question doesn't work. I still get the same Target Invocation exception. So...

Is there any way to do what I want to do with a Dapper FastExpando?

Community
  • 1
  • 1
Jay Stevens
  • 5,863
  • 9
  • 44
  • 67
  • While the chosen answer wouldn't work for "this SO Question", there was an answer on that question that would. http://stackoverflow.com/questions/4939508/get-value-of-c-dynamic-property-via-string/5738983#5738983 – jbtule Jun 02 '11 at 15:22

3 Answers3

36

Sure, it is actually way easier than that:

var sql = "select 1 A, 'two' B";
var row = (IDictionary<string, object>)connection.Query(sql).First();
row["A"].IsEqualTo(1);
row["B"].IsEqualTo("two");
Sam Saffron
  • 128,308
  • 78
  • 326
  • 506
  • I find myself always using `FirstOrDefault()` and still having to check if row is null first before trying to access the row index. Is there a way to try and fetch a column value or a specific row, or return a default value if it doesn't exist? – crush Oct 09 '14 at 21:24
2

Regarding the portion of the title "or index?" - I needed to access results by index since the column names being returned changed sometimes, so you can use a variation of Sam Saffron's answer like this:

var sql = "select 1, 'two'";
var row = (IDictionary<string, object>)connection.Query(sql).First();
row.Values.ElementAt(0).IsEqualTo(1);
row.Values.ElementAt(1).IsEqualTo("two");
David McClelland
  • 2,686
  • 4
  • 28
  • 37
1

There a simple way to access fields direct below sample

string strConexao = WebConfigurationManager.ConnectionStrings["connection"].ConnectionString;

conexaoBD = new SqlConnection(strConexao);
conexaoBD.Open();

var result = conexaoBD.Query("Select Field1,Field2 from Table").First();

//access field value result.Field1 
//access field value result.Field2

if (result.Field1 == "abc"){ dosomething}