cmd.GetByReader - lobodava/artisan-orm GitHub Wiki
cmd.GetByReader
is SqlCommand extension method, which initializes SqlDataReader and pass it as an argument to the Func paremeter.
This method:
- Opens connection;
- Executes SqlDataReader;
- Call the Func parameter passing SqlDataReader as an argument to it;
- Gets result of T type from the Func parameter;
- Closes connection;
- Returns result of T type.
Sync method | Async method |
---|---|
GetByReader<T>(Func<SqlDataReader, T> func) |
GetByReaderAsync<T>(Func<SqlDataReader, T> func) |
cmd.GetByReader
method is usefull when it is required to read the results of multiple select
statements from a stored procedure or SQL text command.
The reading of each select
is carried out by SqlDataReader extension methods provided by Artisan ORM:
reader.ReadTo<T>()
reader.ReadToList<T>()
reader.ReadToArray<T>()
Example of GetByReader<T>(Func<SqlDataReader, T> func)
in repository method:
public User GetUserById(int id)
{
return GetByCommand(cmd =>
{
cmd.UseProcedure("dbo.GetUserById");
cmd.AddIntParam("@Id", id);
return cmd.GetByReader(reader =>
{
var user = reader.ReadTo<User>();
user.RoleIds = reader.ReadToArray<byte>();
return user;
});
});
}
Example of GetByReaderAsync<T>(Func<SqlDataReader, T> func)
in repository method:
public async Task<User> GetUserByIdAsync(int id)
{
return await GetByCommandAsync(cmd =>
{
cmd.UseProcedure("dbo.GetUserById");
cmd.AddIntParam("@Id", id);
return cmd.GetByReaderAsync(reader =>
{
var user = reader.ReadTo<User>();
user.RoleIds = reader.ReadToArray<byte>();
return user;
});
});
}
Stored procedure for above examples:
create procedure dbo.GetUserById
@Id int
as
begin
set nocount on;
-- read User
select Id, [Login], Name, Email from dbo.Users where Id = @Id;
-- read User RoleIds
select RoleId from dbo.UserRoles where UserId = @Id;
end;