Skip to content

Commit bca61eb

Browse files
committed
BulkMatch
1 parent e7bdb61 commit bca61eb

File tree

6 files changed

+50
-4
lines changed

6 files changed

+50
-4
lines changed

src/EntityFrameworkCore.SqlServer.SimpleBulks.DbContextExtensionsTests/Database/Contact.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ public class Contact
1212

1313
public int Index { get; set; }
1414

15+
public Season? Season { get; set; }
16+
17+
public Season? SeasonAsString { get; set; }
18+
1519
public Guid CustomerId { get; set; }
1620

1721
public Customer Customer { get; set; }

src/EntityFrameworkCore.SqlServer.SimpleBulks.DbContextExtensionsTests/Database/Customer.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,9 @@ public class Customer
1212

1313
public int Index { get; set; }
1414

15+
public Season? Season { get; set; }
16+
17+
public Season? SeasonAsString { get; set; }
18+
1519
public ICollection<Contact> Contacts { get; set; }
1620
}

src/EntityFrameworkCore.SqlServer.SimpleBulks.DbContextExtensionsTests/Database/TestDbContext.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,10 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
4646
modelBuilder.Entity<ConfigurationEntry>().Property(x => x.Key).HasColumnName("Key1");
4747

4848
modelBuilder.Entity<Customer>().Property(x => x.Id).HasDefaultValueSql("newsequentialid()");
49+
modelBuilder.Entity<Customer>().Property(x => x.SeasonAsString).HasConversion(v => v.ToString(), v => (Season)Enum.Parse(typeof(Season), v));
4950

5051
modelBuilder.Entity<Contact>().Property(x => x.Id).HasDefaultValueSql("newsequentialid()");
52+
modelBuilder.Entity<Contact>().Property(x => x.SeasonAsString).HasConversion(v => v.ToString(), v => (Season)Enum.Parse(typeof(Season), v));
5153

5254
base.OnModelCreating(modelBuilder);
5355
}

src/EntityFrameworkCore.SqlServer.SimpleBulks.DbContextExtensionsTests/DbContextExtensions/BulkMatchAsyncTests.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ public BulkMatchAsyncTests(ITestOutputHelper output, SqlServerFixture fixture) :
2727
FirstName = "FirstName " + i,
2828
LastName = "LastName " + i,
2929
Index = i,
30-
CurrentCountryIsoCode = isoCodes[random.Next(isoCodes.Length)]
30+
CurrentCountryIsoCode = isoCodes[random.Next(isoCodes.Length)],
31+
Season = Season.Spring,
32+
SeasonAsString = Season.Spring
3133
};
3234

3335
customer.Contacts = new List<Contact>();
@@ -39,6 +41,8 @@ public BulkMatchAsyncTests(ITestOutputHelper output, SqlServerFixture fixture) :
3941
EmailAddress = $"EmailAddress {i} - {j}",
4042
PhoneNumber = $"PhoneNumber {i} - {j}",
4143
CountryIsoCode = isoCodes[random.Next(isoCodes.Length)],
44+
Season = Season.Spring,
45+
SeasonAsString = Season.Spring,
4246
Index = j,
4347
});
4448
}
@@ -87,6 +91,8 @@ public async Task Bulk_Match_GetCustomersByIds_ReturnAllColumns()
8791
Assert.Equal(customers[i].FirstName, customersFromDb[i].FirstName);
8892
Assert.Equal(customers[i].LastName, customersFromDb[i].LastName);
8993
Assert.Equal(customers[i].Index, customersFromDb[i].Index);
94+
Assert.Equal(customers[i].Season, customersFromDb[i].Season);
95+
Assert.Equal(customers[i].SeasonAsString, customersFromDb[i].SeasonAsString);
9096
}
9197
}
9298

@@ -147,6 +153,8 @@ public async Task Bulk_Match_GetContactsByCustomerIds_ReturnAllColumns()
147153
Assert.Equal(contactsInMemory[i].CountryIsoCode, contactsFromDb[i].CountryIsoCode);
148154
Assert.Equal(contactsInMemory[i].Index, contactsFromDb[i].Index);
149155
Assert.Equal(contactsInMemory[i].CustomerId, contactsFromDb[i].CustomerId);
156+
Assert.Equal(contactsInMemory[i].Season, contactsFromDb[i].Season);
157+
Assert.Equal(contactsInMemory[i].SeasonAsString, contactsFromDb[i].SeasonAsString);
150158
}
151159
}
152160

@@ -210,6 +218,8 @@ public async Task Bulk_Match_GetDefaultContactsByCustomerIds_ReturnAllColumns()
210218
Assert.Equal(contactsInMemory[i].CountryIsoCode, contactsFromDb[i].CountryIsoCode);
211219
Assert.Equal(contactsInMemory[i].Index, contactsFromDb[i].Index);
212220
Assert.Equal(contactsInMemory[i].CustomerId, contactsFromDb[i].CustomerId);
221+
Assert.Equal(contactsInMemory[i].Season, contactsFromDb[i].Season);
222+
Assert.Equal(contactsInMemory[i].SeasonAsString, contactsFromDb[i].SeasonAsString);
213223
}
214224
}
215225

src/EntityFrameworkCore.SqlServer.SimpleBulks.DbContextExtensionsTests/DbContextExtensions/BulkMatchTests.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ public BulkMatchTests(ITestOutputHelper output, SqlServerFixture fixture) : base
2727
FirstName = "FirstName " + i,
2828
LastName = "LastName " + i,
2929
Index = i,
30-
CurrentCountryIsoCode = isoCodes[random.Next(isoCodes.Length)]
30+
CurrentCountryIsoCode = isoCodes[random.Next(isoCodes.Length)],
31+
Season = Season.Spring,
32+
SeasonAsString = Season.Spring
3133
};
3234

3335
customer.Contacts = new List<Contact>();
@@ -39,6 +41,8 @@ public BulkMatchTests(ITestOutputHelper output, SqlServerFixture fixture) : base
3941
EmailAddress = $"EmailAddress {i} - {j}",
4042
PhoneNumber = $"PhoneNumber {i} - {j}",
4143
CountryIsoCode = isoCodes[random.Next(isoCodes.Length)],
44+
Season = Season.Spring,
45+
SeasonAsString = Season.Spring,
4246
Index = j,
4347
});
4448
}
@@ -87,6 +91,8 @@ public void Bulk_Match_GetCustomersByIds_ReturnAllColumns()
8791
Assert.Equal(customers[i].FirstName, customersFromDb[i].FirstName);
8892
Assert.Equal(customers[i].LastName, customersFromDb[i].LastName);
8993
Assert.Equal(customers[i].Index, customersFromDb[i].Index);
94+
Assert.Equal(customers[i].Season, customersFromDb[i].Season);
95+
Assert.Equal(customers[i].SeasonAsString, customersFromDb[i].SeasonAsString);
9096
}
9197
}
9298

@@ -147,6 +153,8 @@ public void Bulk_Match_GetContactsByCustomerIds_ReturnAllColumns()
147153
Assert.Equal(contactsInMemory[i].CountryIsoCode, contactsFromDb[i].CountryIsoCode);
148154
Assert.Equal(contactsInMemory[i].Index, contactsFromDb[i].Index);
149155
Assert.Equal(contactsInMemory[i].CustomerId, contactsFromDb[i].CustomerId);
156+
Assert.Equal(contactsInMemory[i].Season, contactsFromDb[i].Season);
157+
Assert.Equal(contactsInMemory[i].SeasonAsString, contactsFromDb[i].SeasonAsString);
150158
}
151159
}
152160

@@ -210,6 +218,8 @@ public void Bulk_Match_GetDefaultContactsByCustomerIds_ReturnAllColumns()
210218
Assert.Equal(contactsInMemory[i].CountryIsoCode, contactsFromDb[i].CountryIsoCode);
211219
Assert.Equal(contactsInMemory[i].Index, contactsFromDb[i].Index);
212220
Assert.Equal(contactsInMemory[i].CustomerId, contactsFromDb[i].CustomerId);
221+
Assert.Equal(contactsInMemory[i].Season, contactsFromDb[i].Season);
222+
Assert.Equal(contactsInMemory[i].SeasonAsString, contactsFromDb[i].SeasonAsString);
213223
}
214224
}
215225

src/EntityFrameworkCore.SqlServer.SimpleBulks/BulkMatch/BulkMatchBuilder.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Data;
77
using System.Linq;
88
using System.Linq.Expressions;
9+
using System.Reflection;
910
using System.Text;
1011
using System.Threading;
1112
using System.Threading.Tasks;
@@ -164,7 +165,7 @@ public List<T> Execute(IEnumerable<T> machedValues)
164165
{
165166
if (!Equals(reader[prop.Name], DBNull.Value))
166167
{
167-
prop.SetValue(obj, reader[prop.Name], null);
168+
prop.SetValue(obj, GetValue(prop, reader, _valueConverters), null);
168169
}
169170
}
170171

@@ -239,7 +240,7 @@ public async Task<List<T>> ExecuteAsync(IEnumerable<T> machedValues, Cancellatio
239240
{
240241
if (!Equals(reader[prop.Name], DBNull.Value))
241242
{
242-
prop.SetValue(obj, reader[prop.Name], null);
243+
prop.SetValue(obj, GetValue(prop, reader, _valueConverters), null);
243244
}
244245
}
245246

@@ -250,4 +251,19 @@ public async Task<List<T>> ExecuteAsync(IEnumerable<T> machedValues, Cancellatio
250251

251252
return results;
252253
}
254+
255+
private static object GetValue(PropertyInfo property, SqlDataReader reader, IReadOnlyDictionary<string, ValueConverter> valueConverters)
256+
{
257+
if (valueConverters != null && valueConverters.TryGetValue(property.Name, out var converter))
258+
{
259+
return converter.ConvertFromProvider(reader[property.Name]);
260+
}
261+
262+
var type = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType;
263+
264+
var tempValue = reader[property.Name];
265+
var value = type.IsEnum && tempValue != null ? Enum.Parse(type, tempValue.ToString()) : tempValue;
266+
267+
return value;
268+
}
253269
}

0 commit comments

Comments
 (0)