SqlDataReader Extentions - lobodava/artisan-orm GitHub Wiki
Word "Read" in extension name means reading of one result set from one select.
After the reading, a Read extension checks if there is the next result set and, if any, moves the cursor to it calling NextResult() method. This allows to read multiple result sets one by one:
var grandRecord = reader.ReadTo<GrandRecord>();
var records = reader.ReadToList<Record>();
var childRecords = reader.ReadToList<ChildRecord>();Every Read extension has optional parameter bool getNextResult = true, so if it is required to stay on the current result set after reading, the call of NextResult() can be cancelled.
SqlDataReader extentions for data reading:
-
Toextensions which use the Mappers:reader.ReadTo<T>reader.ReadToList<T>reader.ReadToArray<T>reader.ReadToObjectRow<T>reader.ReadToObjectRows<T>reader.ReadToDictionary<TKey,TValue>
-
Asextensions which use the Auto-Mapping:reader.ReadAs<T>reader.ReadAsList<T>reader.ReadAsArray<T>reader.ReadAsObjectRowreader.ReadAsObjectRowsreader.ReadAsDictionary<TKey,TValue>
-
Extension for reading data within action parameter:
- reader.Read(Action)
Example:
public User GetById(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;
});
});
}Where the stored procedure dbo.GetUserById looks like this:
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;
The class 'SqlDataReader' (of System.Data.SqlClient namespace) has standard Get methods like: GetInt32, GetBoolean or GetString.
The Get methods are used to read column values.
Within Artisan.Orm the Get methods are used in Mappers and in manual object properties reading.
Artisan.Orm extends the list of Get methods by adding the Nullable versions: GetInt32Nullable, GetBooleanNullable or GetStringNullable, and other useful methods:
| "Get" extensions |
|---|
| GetBooleanNullable |
| GetByteNullable |
| GetBytesNullable |
| GetInt16Nullable |
| GetInt32Nullable |
| GetInt64Nullable |
| GetFloatNullable |
| GetDoubleNullable |
| GetBigDecimal |
| GetBigDecimalNullable |
| GetCharacter |
| GetCharacterNullable |
| GetStringNullable |
| GetDateTimeNullable |
| GetDateTimeOffsetNullable |
| GetTimeSpanNullable |
| GetGuidNullable |
| GetGuidFromString |
| GetGuidFromStringNullable |
| GetBytesFromRowVersion |
| GetInt64FromRowVersion |
| GetInt64FromRowVersionNullable |
| GetBase64StringFromRowVersion |
| GetByteArrayFromString |
| GetInt16ArrayFromString |
| GetInt32ArrayFromString |
Examples:
public IList<User> GetUsersWithRoles()
{
return GetByCommand(cmd =>
{
cmd.UseSql( "select * from dbo.vwUsers; " +
"select UserId, RoleId from dbo.UserRoles;" +
"select Id, Code, Name from dbo.Roles");
return cmd.GetByReader(reader =>
{
var users = reader.ReadToList<User>();
var userRoles = reader.ReadToList(r => new {UserId = r.GetInt32(0), RoleId = r.GetByte(1)});
var roles = reader.ReadAsList<Role>();
reader.Close();
foreach (var user in users)
{
user.Roles = new List<Role>();
foreach (var role in roles)
if (userRoles.Any(ur => ur.UserId == user.Id && ur.RoleId == role.Id))
user.Roles.Add(role);
}
return users;
});
});
}