Skip to content

Commit 4f8941d

Browse files
committed
- added MapValue(s) to IQueryMapper
1 parent 8b3f024 commit 4f8941d

3 files changed

Lines changed: 65 additions & 2 deletions

File tree

Shuttle.Core.Data.Tests/QueryMapper/QueryMapperFixture.cs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Linq;
1+
using System;
2+
using System.Linq;
23
using NUnit.Framework;
34

45
namespace Shuttle.Core.Data.Tests
@@ -79,5 +80,33 @@ Age as TheAge
7980
Assert.AreEqual(2, mappedRows.Count());
8081
}
8182
}
83+
84+
[Test]
85+
public void Should_be_able_to_do_value_mapping()
86+
{
87+
var mapper = new QueryMapper(new DatabaseGateway());
88+
89+
var queryRow = RawQuery.Create(@"
90+
select top 1
91+
Id
92+
from
93+
BasicMapping
94+
");
95+
96+
var queryRows = RawQuery.Create(@"
97+
select
98+
Id
99+
from
100+
BasicMapping
101+
");
102+
103+
using (GetDatabaseContext())
104+
{
105+
var value = mapper.MapValue<Guid>(queryRow);
106+
var values = mapper.MapValues<Guid>(queryRows);
107+
108+
Assert.AreEqual(2, values.Count());
109+
}
110+
}
82111
}
83112
}

Shuttle.Core.Data/IQueryMapper.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,7 @@ public interface IQueryMapper
88
IEnumerable<MappedRow<T>> MapRows<T>(IQuery query) where T : new();
99
T MapObject<T>(IQuery query) where T : new();
1010
IEnumerable<T> MapObjects<T>(IQuery query) where T : new();
11+
T MapValue<T>(IQuery query);
12+
IEnumerable<T> MapValues<T>(IQuery query);
1113
}
1214
}

Shuttle.Core.Data/QueryMapper.cs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using System.Data;
34
using System.Linq;
45
using System.Reflection;
@@ -19,6 +20,8 @@ public QueryMapper(IDatabaseGateway databaseGateway)
1920

2021
public MappedRow<T> MapRow<T>(IQuery query) where T : new()
2122
{
23+
Guard.AgainstNull(query, "query");
24+
2225
var row = _databaseGateway.GetSingleRowUsing(query);
2326

2427
return new MappedRow<T>(row, Map<T>(row));
@@ -52,17 +55,46 @@ public QueryMapper(IDatabaseGateway databaseGateway)
5255

5356
public IEnumerable<MappedRow<T>> MapRows<T>(IQuery query) where T : new()
5457
{
58+
Guard.AgainstNull(query, "query");
59+
5560
return _databaseGateway.GetRowsUsing(query).Select(row => new MappedRow<T>(row, Map<T>(row)));
5661
}
5762

5863
public T MapObject<T>(IQuery query) where T : new()
5964
{
65+
Guard.AgainstNull(query, "query");
66+
6067
return Map<T>(_databaseGateway.GetSingleRowUsing(query));
6168
}
6269

6370
public IEnumerable<T> MapObjects<T>(IQuery query) where T : new()
6471
{
72+
Guard.AgainstNull(query, "query");
73+
6574
return _databaseGateway.GetRowsUsing(query).Select(row => Map<T>(row));
6675
}
76+
77+
public T MapValue<T>(IQuery query)
78+
{
79+
Guard.AgainstNull(query, "query");
80+
81+
return MapRowValue<T>(_databaseGateway.GetSingleRowUsing(query));
82+
}
83+
84+
public IEnumerable<T> MapValues<T>(IQuery query)
85+
{
86+
Guard.AgainstNull(query, "query");
87+
88+
return _databaseGateway.GetRowsUsing(query).Select(row => MapRowValue<T>(row));
89+
}
90+
91+
private T MapRowValue<T>(DataRow row)
92+
{
93+
var underlyingSystemType = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T);
94+
95+
return row[0] == null
96+
? default(T)
97+
: (T)Convert.ChangeType(row[0], underlyingSystemType);
98+
}
6799
}
68100
}

0 commit comments

Comments
 (0)