diff --git a/Dapper.MoqTests.Samples/Car.cs b/Dapper.MoqTests.Samples/Car.cs index 959f816..5588f9d 100644 --- a/Dapper.MoqTests.Samples/Car.cs +++ b/Dapper.MoqTests.Samples/Car.cs @@ -1,4 +1,6 @@ -namespace Dapper.MoqTests.Samples +using System; + +namespace Dapper.MoqTests.Samples { // ReSharper disable UnusedAutoPropertyAccessor.Global public class Car @@ -6,5 +8,6 @@ public class Car public string Registration { get; set; } public string Make { get; set; } public string Model { get; set; } + public DateTime? DateRegistered { get; set; } } } diff --git a/Dapper.MoqTests.Samples/Samples.cs b/Dapper.MoqTests.Samples/Samples.cs index 6a95e67..d986ca5 100644 --- a/Dapper.MoqTests.Samples/Samples.cs +++ b/Dapper.MoqTests.Samples/Samples.cs @@ -197,13 +197,15 @@ public void ReturnManyComplexObjects() { Registration = "ABC123", Make = "Vauxhall", - Model = "Astra" + Model = "Astra", + DateRegistered = null, }; var ford = new Car { Registration = "DEF456", Make = "Ford", - Model = "Mondeo" + Model = "Mondeo", + DateRegistered = new DateTime(2022, 2, 1, 12, 11, 10), }; connectionFactory .Setup(f => f.OpenConnection()) @@ -215,6 +217,7 @@ from [Cars] var result = repository.GetCars(); + Assert.That(result.Select(c => c.DateRegistered), Is.EquivalentTo(new DateTime?[] { null, new DateTime(2022, 2, 1, 12, 11, 10) })); Assert.That(result.Select(c => c.Model), Is.EquivalentTo(new[] { "Astra", "Mondeo" })); } diff --git a/Dapper.MoqTests/ObjectExtensions.cs b/Dapper.MoqTests/ObjectExtensions.cs index 0c71dac..f075d3c 100644 --- a/Dapper.MoqTests/ObjectExtensions.cs +++ b/Dapper.MoqTests/ObjectExtensions.cs @@ -24,13 +24,24 @@ public static IDataReader GetDataReader(this object value) var properties = value.GetType() .GetProperties() - .Where(p => IsPrimitiveType(p.PropertyType)) + .Select(p => new { Property = p, NullablePrimitiveType = NullablePrimitiveType(p.PropertyType) }) + .Where(p => p.NullablePrimitiveType != null || IsPrimitiveType(p.Property.PropertyType)) .ToArray(); var dataTable = new DataTable(); foreach (var property in properties) - dataTable.Columns.Add(property.Name, property.PropertyType); + { + if (property.NullablePrimitiveType != null) + { + var column = new DataColumn(property.Property.Name, property.NullablePrimitiveType); + column.AllowDBNull = true; + dataTable.Columns.Add(column); + break; + } + + dataTable.Columns.Add(property.Property.Name, property.Property.PropertyType); + } - var rowValues = properties.Select(p => p.GetValue(value)).ToArray(); + var rowValues = properties.Select(p => p.Property.GetValue(value)).ToArray(); dataTable.Rows.Add(rowValues); return new DataTableReader(dataTable); @@ -48,15 +59,26 @@ private static DataTable GetDataTableForArray(IEnumerable value) var properties = elementType .GetProperties() - .Where(p => IsPrimitiveType(p.PropertyType)) + .Select(p => new { Property = p, NullablePrimitiveType = NullablePrimitiveType(p.PropertyType) }) + .Where(p => p.NullablePrimitiveType != null || IsPrimitiveType(p.Property.PropertyType)) .ToArray(); var dataTable = new DataTable(); foreach (var property in properties) - dataTable.Columns.Add(property.Name, property.PropertyType); + { + if (property.NullablePrimitiveType != null) + { + var column = new DataColumn(property.Property.Name, property.NullablePrimitiveType); + column.AllowDBNull = true; + dataTable.Columns.Add(column); + break; + } + + dataTable.Columns.Add(property.Property.Name, property.Property.PropertyType); + } foreach (var row in value) { - var rowValues = properties.Select(p => p.GetValue(row)).ToArray(); + var rowValues = properties.Select(p => p.Property.GetValue(row)).ToArray(); dataTable.Rows.Add(rowValues); } @@ -83,5 +105,16 @@ private static bool IsPrimitiveType(Type type) { return type.IsPrimitive || PrimitiveDataTypes.Contains(type); } + private static Type NullablePrimitiveType(Type type) + { + var underlyingType = Nullable.GetUnderlyingType(type); + + if (underlyingType != null && IsPrimitiveType(underlyingType)) + { + return underlyingType; + } + + return null; + } } }