Skip to content

Commit 181b458

Browse files
committed
.Net 8
1 parent 24c2ae2 commit 181b458

10 files changed

Lines changed: 471 additions & 28 deletions

File tree

src/ConnectionExtensionsExamples/Program.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@
2626
.ConfigureProperty(x => x.RowVersion, readOnly: true)
2727
.ConfigureProperty(x => x.SeasonAsString, columnType: "nvarchar(max)")
2828
.ConfigurePropertyConversion(x => x.SeasonAsString, y => y.ToString(), z => (Season)Enum.Parse(typeof(Season), z))
29-
.ParameterConverter((data, propertyName) =>
29+
.ParameterConverter((data, propertyName, parameterName) =>
3030
{
3131
if (propertyName == "CreatedDateTime")
3232
{
33-
return new SqlParameter(propertyName, data.CreatedDateTime);
33+
return new SqlParameter(parameterName, data.CreatedDateTime);
3434
}
3535

3636
return null;
@@ -135,7 +135,8 @@ await connection.BulkInsertAsync(configurationEntries,
135135
return new WhenNotMatchedBySourceAction
136136
{
137137
AndCondition = $"{ctx.GetTargetTableColumnWithAlias("Key")} LIKE 'Key%'",
138-
ThenAction = $"UPDATE SET {ctx.GetTargetTableColumnWithoutAlias("Key")} = 'xxx'"
138+
ThenAction = $"UPDATE SET {ctx.GetTargetTableColumnWithoutAlias("Key")} = @Key",
139+
Parameters = new { Key = "XXX" }
139140
};
140141
}
141142
});
Lines changed: 367 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,367 @@
1+
using EntityFrameworkCore.SqlServer.SimpleBulks.Extensions;
2+
using System.Data;
3+
4+
namespace EntityFrameworkCore.SqlServer.SimpleBulks.Tests.ObjectExtensions;
5+
6+
public class ToSqlParameterInforsTests
7+
{
8+
[Fact]
9+
public void ToSqlParameterInfors_NullParameter_ReturnsEmptyList()
10+
{
11+
// Arrange
12+
object? parameters = null;
13+
14+
// Act
15+
var result = parameters.ToSqlParameterInfors();
16+
17+
// Assert
18+
Assert.NotNull(result);
19+
Assert.Empty(result);
20+
}
21+
22+
[Fact]
23+
public void ToSqlParameterInfors_ObjectWithStringProperty_ReturnsCorrectParameter()
24+
{
25+
// Arrange
26+
var parameters = new { Name = "TestValue" };
27+
28+
// Act
29+
var result = parameters.ToSqlParameterInfors();
30+
31+
// Assert
32+
Assert.Single(result);
33+
Assert.Equal("@Name", result[0].Name);
34+
Assert.Equal("nvarchar(max)", result[0].Type);
35+
Assert.Equal("@Name", result[0].Parameter.ParameterName);
36+
Assert.Equal("TestValue", result[0].Parameter.Value);
37+
Assert.Equal(SqlDbType.NVarChar, result[0].Parameter.SqlDbType);
38+
}
39+
40+
[Fact]
41+
public void ToSqlParameterInfors_ObjectWithIntProperty_ReturnsCorrectParameter()
42+
{
43+
// Arrange
44+
var parameters = new { Count = 42 };
45+
46+
// Act
47+
var result = parameters.ToSqlParameterInfors();
48+
49+
// Assert
50+
Assert.Single(result);
51+
Assert.Equal("@Count", result[0].Name);
52+
Assert.Equal("int", result[0].Type);
53+
Assert.Equal("@Count", result[0].Parameter.ParameterName);
54+
Assert.Equal(42, result[0].Parameter.Value);
55+
Assert.Equal(SqlDbType.Int, result[0].Parameter.SqlDbType);
56+
}
57+
58+
[Fact]
59+
public void ToSqlParameterInfors_ObjectWithMultipleProperties_ReturnsAllParameters()
60+
{
61+
// Arrange
62+
var parameters = new
63+
{
64+
Id = 1,
65+
Name = "Test",
66+
IsActive = true
67+
};
68+
69+
// Act
70+
var result = parameters.ToSqlParameterInfors();
71+
72+
// Assert
73+
Assert.Equal(3, result.Count);
74+
75+
var idParam = result.First(p => p.Name == "@Id");
76+
Assert.Equal("int", idParam.Type);
77+
Assert.Equal("@Id", idParam.Parameter.ParameterName);
78+
Assert.Equal(1, idParam.Parameter.Value);
79+
80+
var nameParam = result.First(p => p.Name == "@Name");
81+
Assert.Equal("nvarchar(max)", nameParam.Type);
82+
Assert.Equal("@Name", nameParam.Parameter.ParameterName);
83+
Assert.Equal("Test", nameParam.Parameter.Value);
84+
85+
var isActiveParam = result.First(p => p.Name == "@IsActive");
86+
Assert.Equal("bit", isActiveParam.Type);
87+
Assert.Equal("@IsActive", isActiveParam.Parameter.ParameterName);
88+
Assert.Equal(true, isActiveParam.Parameter.Value);
89+
}
90+
91+
[Fact]
92+
public void ToSqlParameterInfors_ObjectWithDateTimeProperty_ReturnsCorrectParameter()
93+
{
94+
// Arrange
95+
var testDate = new DateTime(2024, 1, 15, 10, 30, 0);
96+
var parameters = new { CreatedDate = testDate };
97+
98+
// Act
99+
var result = parameters.ToSqlParameterInfors();
100+
101+
// Assert
102+
Assert.Single(result);
103+
Assert.Equal("@CreatedDate", result[0].Name);
104+
Assert.Equal("datetime2", result[0].Type);
105+
Assert.Equal("@CreatedDate", result[0].Parameter.ParameterName);
106+
Assert.Equal(testDate, result[0].Parameter.Value);
107+
Assert.Equal(SqlDbType.DateTime2, result[0].Parameter.SqlDbType);
108+
}
109+
110+
[Fact]
111+
public void ToSqlParameterInfors_ObjectWithGuidProperty_ReturnsCorrectParameter()
112+
{
113+
// Arrange
114+
var testGuid = Guid.NewGuid();
115+
var parameters = new { UniqueId = testGuid };
116+
117+
// Act
118+
var result = parameters.ToSqlParameterInfors();
119+
120+
// Assert
121+
Assert.Single(result);
122+
Assert.Equal("@UniqueId", result[0].Name);
123+
Assert.Equal("uniqueidentifier", result[0].Type);
124+
Assert.Equal("@UniqueId", result[0].Parameter.ParameterName);
125+
Assert.Equal(testGuid, result[0].Parameter.Value);
126+
Assert.Equal(SqlDbType.UniqueIdentifier, result[0].Parameter.SqlDbType);
127+
}
128+
129+
[Fact]
130+
public void ToSqlParameterInfors_ObjectWithNullableIntWithValue_ReturnsCorrectParameter()
131+
{
132+
// Arrange
133+
int? value = 100;
134+
var parameters = new { NullableInt = value };
135+
136+
// Act
137+
var result = parameters.ToSqlParameterInfors();
138+
139+
// Assert
140+
Assert.Single(result);
141+
Assert.Equal("@NullableInt", result[0].Name);
142+
Assert.Equal("int", result[0].Type);
143+
Assert.Equal("@NullableInt", result[0].Parameter.ParameterName);
144+
Assert.Equal(100, result[0].Parameter.Value);
145+
Assert.Equal(SqlDbType.Int, result[0].Parameter.SqlDbType);
146+
}
147+
148+
[Fact]
149+
public void ToSqlParameterInfors_ObjectWithNullableIntWithNull_ReturnsDBNullValue()
150+
{
151+
// Arrange
152+
int? value = null;
153+
var parameters = new { NullableInt = value };
154+
155+
// Act
156+
var result = parameters.ToSqlParameterInfors();
157+
158+
// Assert
159+
Assert.Single(result);
160+
Assert.Equal("@NullableInt", result[0].Name);
161+
Assert.Equal("int", result[0].Type);
162+
Assert.Equal("@NullableInt", result[0].Parameter.ParameterName);
163+
Assert.Equal(DBNull.Value, result[0].Parameter.Value);
164+
}
165+
166+
[Fact]
167+
public void ToSqlParameterInfors_ObjectWithNullString_ReturnsDBNullValue()
168+
{
169+
// Arrange
170+
string? value = null;
171+
var parameters = new { NullString = value };
172+
173+
// Act
174+
var result = parameters.ToSqlParameterInfors();
175+
176+
// Assert
177+
Assert.Single(result);
178+
Assert.Equal("@NullString", result[0].Name);
179+
Assert.Equal("@NullString", result[0].Parameter.ParameterName);
180+
Assert.Equal(DBNull.Value, result[0].Parameter.Value);
181+
}
182+
183+
[Fact]
184+
public void ToSqlParameterInfors_ObjectWithDecimalProperty_ReturnsCorrectParameter()
185+
{
186+
// Arrange
187+
var parameters = new { Amount = 123.45m };
188+
189+
// Act
190+
var result = parameters.ToSqlParameterInfors();
191+
192+
// Assert
193+
Assert.Single(result);
194+
Assert.Equal("@Amount", result[0].Name);
195+
Assert.Equal("decimal(38, 20)", result[0].Type);
196+
Assert.Equal("@Amount", result[0].Parameter.ParameterName);
197+
Assert.Equal(123.45m, result[0].Parameter.Value);
198+
Assert.Equal(SqlDbType.Decimal, result[0].Parameter.SqlDbType);
199+
}
200+
201+
[Fact]
202+
public void ToSqlParameterInfors_ObjectWithLongProperty_ReturnsCorrectParameter()
203+
{
204+
// Arrange
205+
var parameters = new { BigNumber = 9223372036854775807L };
206+
207+
// Act
208+
var result = parameters.ToSqlParameterInfors();
209+
210+
// Assert
211+
Assert.Single(result);
212+
Assert.Equal("@BigNumber", result[0].Name);
213+
Assert.Equal("bigint", result[0].Type);
214+
Assert.Equal("@BigNumber", result[0].Parameter.ParameterName);
215+
Assert.Equal(9223372036854775807L, result[0].Parameter.Value);
216+
Assert.Equal(SqlDbType.BigInt, result[0].Parameter.SqlDbType);
217+
}
218+
219+
[Fact]
220+
public void ToSqlParameterInfors_ObjectWithDoubleProperty_ReturnsCorrectParameter()
221+
{
222+
// Arrange
223+
var parameters = new { FloatValue = 3.14159d };
224+
225+
// Act
226+
var result = parameters.ToSqlParameterInfors();
227+
228+
// Assert
229+
Assert.Single(result);
230+
Assert.Equal("@FloatValue", result[0].Name);
231+
Assert.Equal("float", result[0].Type);
232+
Assert.Equal("@FloatValue", result[0].Parameter.ParameterName);
233+
Assert.Equal(3.14159d, result[0].Parameter.Value);
234+
Assert.Equal(SqlDbType.Float, result[0].Parameter.SqlDbType);
235+
}
236+
237+
[Fact]
238+
public void ToSqlParameterInfors_ObjectWithByteArrayProperty_ReturnsCorrectParameter()
239+
{
240+
// Arrange
241+
var bytes = new byte[] { 1, 2, 3, 4, 5 };
242+
var parameters = new { BinaryData = bytes };
243+
244+
// Act
245+
var result = parameters.ToSqlParameterInfors();
246+
247+
// Assert
248+
Assert.Single(result);
249+
Assert.Equal("@BinaryData", result[0].Name);
250+
Assert.Equal("nvarchar(max)", result[0].Type);
251+
Assert.Equal("@BinaryData", result[0].Parameter.ParameterName);
252+
Assert.Equal(bytes, result[0].Parameter.Value);
253+
Assert.Equal(SqlDbType.NVarChar, result[0].Parameter.SqlDbType);
254+
}
255+
256+
[Fact]
257+
public void ToSqlParameterInfors_ObjectWithDateTimeOffsetProperty_ReturnsCorrectParameter()
258+
{
259+
// Arrange
260+
var testDate = new DateTimeOffset(2024, 1, 15, 10, 30, 0, TimeSpan.FromHours(5));
261+
var parameters = new { CreatedAt = testDate };
262+
263+
// Act
264+
var result = parameters.ToSqlParameterInfors();
265+
266+
// Assert
267+
Assert.Single(result);
268+
Assert.Equal("@CreatedAt", result[0].Name);
269+
Assert.Equal("datetimeoffset", result[0].Type);
270+
Assert.Equal("@CreatedAt", result[0].Parameter.ParameterName);
271+
Assert.Equal(testDate, result[0].Parameter.Value);
272+
Assert.Equal(SqlDbType.DateTimeOffset, result[0].Parameter.SqlDbType);
273+
}
274+
275+
[Fact]
276+
public void ToSqlParameterInfors_ObjectWithEnumProperty_ReturnsIntType()
277+
{
278+
// Arrange
279+
var parameters = new { Status = TestStatus.Active };
280+
281+
// Act
282+
var result = parameters.ToSqlParameterInfors();
283+
284+
// Assert
285+
Assert.Single(result);
286+
Assert.Equal("@Status", result[0].Name);
287+
Assert.Equal("int", result[0].Type);
288+
Assert.Equal("@Status", result[0].Parameter.ParameterName);
289+
Assert.Equal(SqlDbType.Int, result[0].Parameter.SqlDbType);
290+
}
291+
292+
[Fact]
293+
public void ToSqlParameterInfors_ObjectWithNullableEnumWithValue_ReturnsIntType()
294+
{
295+
// Arrange
296+
TestStatus? status = TestStatus.Inactive;
297+
var parameters = new { Status = status };
298+
299+
// Act
300+
var result = parameters.ToSqlParameterInfors();
301+
302+
// Assert
303+
Assert.Single(result);
304+
Assert.Equal("@Status", result[0].Name);
305+
Assert.Equal("int", result[0].Type);
306+
Assert.Equal("@Status", result[0].Parameter.ParameterName);
307+
Assert.Equal(SqlDbType.Int, result[0].Parameter.SqlDbType);
308+
}
309+
310+
[Fact]
311+
public void ToSqlParameterInfors_ObjectWithNullableEnumWithNull_ReturnsDBNullValue()
312+
{
313+
// Arrange
314+
TestStatus? status = null;
315+
var parameters = new { Status = status };
316+
317+
// Act
318+
var result = parameters.ToSqlParameterInfors();
319+
320+
// Assert
321+
Assert.Single(result);
322+
Assert.Equal("@Status", result[0].Name);
323+
Assert.Equal("int", result[0].Type);
324+
Assert.Equal("@Status", result[0].Parameter.ParameterName);
325+
Assert.Equal(DBNull.Value, result[0].Parameter.Value);
326+
}
327+
328+
[Fact]
329+
public void ToSqlParameterInfors_ObjectWithTimeSpanProperty_ReturnsCorrectParameter()
330+
{
331+
// Arrange
332+
var timeSpan = new TimeSpan(10, 30, 0);
333+
var parameters = new { Duration = timeSpan };
334+
335+
// Act
336+
var result = parameters.ToSqlParameterInfors();
337+
338+
// Assert
339+
Assert.Single(result);
340+
Assert.Equal("@Duration", result[0].Name);
341+
Assert.Equal("nvarchar(max)", result[0].Type);
342+
Assert.Equal("@Duration", result[0].Parameter.ParameterName);
343+
Assert.Equal(timeSpan, result[0].Parameter.Value);
344+
Assert.Equal(SqlDbType.NVarChar, result[0].Parameter.SqlDbType);
345+
}
346+
347+
[Fact]
348+
public void ToSqlParameterInfors_EmptyObject_ReturnsEmptyList()
349+
{
350+
// Arrange
351+
var parameters = new { };
352+
353+
// Act
354+
var result = parameters.ToSqlParameterInfors();
355+
356+
// Assert
357+
Assert.NotNull(result);
358+
Assert.Empty(result);
359+
}
360+
361+
private enum TestStatus
362+
{
363+
Inactive = 0,
364+
Active = 1,
365+
Pending = 2
366+
}
367+
}

0 commit comments

Comments
 (0)