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>()

Examples:

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;
⚠️ **GitHub.com Fallback** ⚠️