Search code examples
asp.netobjectdapper

Dapper question. Getting values from returned object


Just started learning Dapper. I have an ADO.NET background. Using a demo I downloaded, I can insert/delete data from a webform into a MySql table just fine. This, however, I have searched all morning on.

In retrieving a single row from the db by ID, it doesn't return a LIST<>, it seems to be just an object (using code from the demo I downloaded). The query works, I get the object back. It has the fields: "ProductID, Description and Price".

The only way I could get the values to those three fields was like this:

System.Reflection.PropertyInfo pi = Product.GetType().GetProperty("ProductID");
System.Reflection.PropertyInfo desc = Product.GetType().GetProperty("Description");
System.Reflection.PropertyInfo price = Product.GetType().GetProperty("Price");

int _ProductID = (int)(pi.GetValue(Product, null));
string _Description = (string)(desc.GetValue(Product, null));
decimal _Price = (decimal)(price.GetValue(Product, null));

This works and gets the correct values for the three fields.

I'm used to looping through DataTables, but I just think there is probably a better way to get those values.

Is this the correct way to do this or am I missing something? I did actually read documentation and mess with this all morning before asking, too.

Some of the things I looked at seem to be very complex. I thought Dapper was supposed to simplify things.


Solution

  • The main Query<T> API returns an IEnumerable<T>, which often will be a List<T>; the AsList<T>() extension method can get it back to a list without a copy, but either way: they are just T, for whatever T you asked for. If you asked for Query<Product>, then: they should be Product instances:

    var results = connection.Query<Product>(someSql, someArgs); // perhaps .AsList()
    foreach (Product obj in results) { // "var obj" would be fine here too
        // now just use obj.ProductID, obj.Description and obj.Price
    }
    

    If that didn't work: check that you used the <T> version of Query. There is a non-generic variant too, which returns dynamic. Frankly, you should almost always use the <T> version.

    Note: I'm assuming that somewhere you have something like

    class Product {
        public int ProductID {get;set;}
        public string Description {get;set;}
        public decimal Price {get;set;}
    }