Add declarative procedure result-set binding

This commit is contained in:
2026-02-27 15:52:42 +01:00
parent cb6437ee9d
commit 99ff6b3d29
6 changed files with 679 additions and 76 deletions

View File

@@ -172,6 +172,40 @@ namespace DynamORM.Tests.Procedure
}
}
[Test]
public void TestDeclaredResultCanReadAttributedResultSets()
{
using (var reader = new FakeMultiResultDataReader(
Tuple.Create(new[] { "Code" }, new[] { typeof(string) }, new[] { new object[] { "FIRST" }, new object[] { "SECOND" } }),
Tuple.Create(new[] { "Code" }, new[] { typeof(string) }, new[] { new object[] { "A" }, new object[] { "B" } }),
Tuple.Create(new[] { "State" }, new[] { typeof(int) }, new[] { new object[] { 10 }, new object[] { 20 } }),
Tuple.Create(
new[] { "id", "code", "first" },
new[] { typeof(long), typeof(string), typeof(string) },
new[] { new object[] { 1L, "U1", "One" } }),
Tuple.Create(
new[] { "id", "code", "first" },
new[] { typeof(long), typeof(string), typeof(string) },
new[] { new object[] { 2L, "U2", "Two" }, new object[] { 3L, "U3", "Three" } }),
Tuple.Create(new[] { "Code" }, new[] { typeof(string) }, new[] { new object[] { "X" }, new object[] { "Y" } })))
{
var result = DynamicProcedureResultBinder.ReadDeclaredResult(typeof(ProcedureAttributedResult), reader) as ProcedureAttributedResult;
Assert.NotNull(result);
Assert.AreEqual("FIRST", result.FirstCode);
CollectionAssert.AreEqual(new[] { "A", "B" }, result.Codes);
CollectionAssert.AreEqual(new[] { 10, 20 }, result.States);
Assert.NotNull(result.User);
Assert.AreEqual(1L, result.User.Id);
Assert.AreEqual("U1", result.User.Code);
Assert.NotNull(result.AllUsers);
Assert.AreEqual(2, result.AllUsers.Count);
Assert.NotNull(result.CodesTable);
Assert.AreEqual("codes_table", result.CodesTable.TableName);
Assert.AreEqual(2, result.CodesTable.Rows.Count);
}
}
[Test]
public void TestDeclaredResultPayloadCanAugmentReaderResult()
{
@@ -195,5 +229,13 @@ namespace DynamORM.Tests.Procedure
CollectionAssert.AreEqual(new[] { "A" }, result.Codes);
CollectionAssert.AreEqual(new[] { 10 }, result.States);
}
[Test]
public void TestDeclaredResultBindingDetectionSupportsAttributedResults()
{
Assert.IsTrue(DynamicProcedureResultBinder.HasDeclaredResultBinding(typeof(ProcedureMultiResult)));
Assert.IsTrue(DynamicProcedureResultBinder.HasDeclaredResultBinding(typeof(ProcedureAttributedResult)));
Assert.IsFalse(DynamicProcedureResultBinder.HasDeclaredResultBinding(typeof(ProcedureParameterResult)));
}
}
}