I have been using Dapper.net for a while now and its a very good ORM mapper which works great with .Net dynamic types.
But I noticed that when Dapper retrieves data from a database it returns as DapperRow
type.
Is there are any way that I can return it in any other type Like System.Dynamic.ExpandoObject
?
Sure!
As per dapper documentation use the query method and get your dymanics:
dynamic account = conn.Query<dynamic>(@" SELECT Name, Address, Country FROM Account WHERE Id = @Id", new { Id = Id }).FirstOrDefault(); Console.WriteLine(account.Name); Console.WriteLine(account.Address); Console.WriteLine(account.Country);
As you can see you get a dynamic object and you can access its properties as long as they are well defined in the query statement.
If you omit .FirstOrDefault()
you get an IEnumerable<dynamic>
which you can do whatever you want with it.
The DapperRow
object is designed to share a lot of state between rows. For example, if you fetch 40 rows, the column names etc are only stored once. If we used ExpandoObject
, this would need to be configured per row. Hence, the use of DapperRow
as the behind-the-scenes implementation detail is a deliberate efficiency thing.
Note that the object returned from the dynamic
APIs can also be cast as IDictionary<string,object>
.
I would, however, be open to supporting other types that support this dictionary usage - of which ExpandoObject
is one. So yes, it could be changed such that:
var rows = conn.Query<ExpandoObject>(...);
works. It simply requires code to support it, and that code does not currently exist. So "no, but perhaps in a future build".
Note also that you don't need to use DapperRow
at all... The more expected scenario is to use the generic API to materialize your own types.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With