Dapper has fairly extensive support for stored procedures.
Trivial:
create proc spGetOrder @Id int as select * from Orders where Id = @Id select * from OrderItems where OrderId = @Id
It can be compared with the following.
var grid = cnn.QueryMultiple("spGetOrder", new {Id = 1}, commandType: CommandType.StoredProcedure); var order = grid.Read<Order>(); order.Items = grid.Read<OrderItems>();
In addition, you have support for:
- A multi-match that allows you to use separate lines for multiple objects
- Support for input, output and return options.
- Extensible interface for processing parameters of a specific database (for example, TVP)
So for example:
create proc spGetOrderFancy @Id int, @Message nvarchar(100) output as set @Message = N'My message' select * from Orders join Users u on OwnerId = u.Id where Id = @Id select * from OrderItems where OrderId = @Id return @@rowcount
May be displayed using:
var p = new DynamicParameters(); p.Add("Id", 1); p.Add("Message",direction: ParameterDirection.Output); p.Add("rval",direction: ParameterDirection.ReturnValue); var grid = cnn.QueryMultiple("spGetOrder", p, commandType: CommandType.StoredProcedure); var order = grid.Read<Order,User,Order>((o,u) => {o.Owner = u; return o;}); order.Items = grid.Read<OrderItems>(); var returnVal = p.Get<int>("rval"); var message = p.Get<string>("message");
Finally, Dapper also allows you to implement a custom parameter:
public interface IDynamicParameters { void AddParameters(IDbCommand command); }
When implementing this interface, you can tell Dapper which parameters you want to add to your command. This allows you to maintain tabular parameters and other database-specific functions.
Now you use it in Stack Overflow ...
source share