From 1ee2bd67d4dace2f70b19ac7eccdbca1c1c1dbb0 Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Sat, 23 Apr 2011 21:16:54 +1000 Subject: [PATCH] Rename helper methods to Execute and Query api design for multi-mapping --- Dapper/SqlMapper.cs | 86 ++++++++++++++++++++++----------------- Tests/PerformanceTests.cs | 4 +- Tests/Tests.cs | 44 ++++++++++---------- 3 files changed, 73 insertions(+), 61 deletions(-) diff --git a/Dapper/SqlMapper.cs b/Dapper/SqlMapper.cs index e5c1e72..91e13c7 100644 --- a/Dapper/SqlMapper.cs +++ b/Dapper/SqlMapper.cs @@ -134,95 +134,107 @@ public bool Equals(Identity other) /// Execute parameterized SQL /// /// Number of rows affected - public static int ExecuteMapperCommand(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null) + public static int Execute(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null) { return ExecuteCommand(cnn, transaction, sql, GetParamInfo(param)); } - static class DynamicStub - { - public static Type Type = typeof(DynamicStub); - } - /// - /// Enumerates the query, keeping the reader open after it is called. Use when iterating through huge result sets . You should usually use ExecuteMapperQuery instead. + /// Return a list of dynamic objects, reader is closed after the call /// - public static IEnumerable EnumerateMapperQuery(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null) + public static IEnumerable Query(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, bool buffered = true) { - var identity = new Identity(sql, cnn, typeof(T)); + if (!buffered) + { + return EnumerateMapperQuery(cnn, sql, param, transaction); + } + + var identity = new Identity(sql, cnn, DynamicStub.Type); + var list = new List(); using (var reader = GetReader(cnn, transaction, sql, GetParamInfo(param))) { - Func deserializer = GetDeserializer(identity, reader); + Func deserializer = GetDeserializer(identity, reader); while (reader.Read()) { - yield return deserializer(reader); + list.Add(deserializer(reader)); } } + return list; } /// - /// Enumerates the query, keeping the reader open after it is called. Use when iterating through huge result sets. You should usually use ExecuteMapperQuery instead + /// Return a typed list of objects, reader is closed after the call /// - public static IEnumerable EnumerateMapperQuery(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null) + public static IEnumerable Query(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, bool buffered = true) { - var identity = new Identity(sql, cnn, DynamicStub.Type); + + if (!buffered) + { + return EnumerateMapperQuery(cnn, sql, param, transaction); + } + + var identity = new Identity(sql, cnn, typeof(T)); + var rval = new List(); + using (var reader = GetReader(cnn, transaction, sql, GetParamInfo(param))) { - Func deserializer = GetDeserializer(identity, reader); + Func deserializer = GetDeserializer(identity, reader); while (reader.Read()) { - yield return deserializer(reader); + rval.Add(deserializer(reader)); } } + return rval; + } + + public static List Query(this IDbConnection cnn, string sql, Action map, object param = null, IDbTransaction transaction = null) + { + return null; + } + + + static class DynamicStub + { + public static Type Type = typeof(DynamicStub); } /// - /// Return a list of dynamic objects, reader is closed after the call + /// Enumerates the query, keeping the reader open after it is called. Use when iterating through huge result sets . You should usually use ExecuteMapperQuery instead. /// - public static List ExecuteMapperQuery(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null) + static IEnumerable EnumerateMapperQuery(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null) { - var identity = new Identity(sql, cnn, DynamicStub.Type); - var list = new List(); + var identity = new Identity(sql, cnn, typeof(T)); using (var reader = GetReader(cnn, transaction, sql, GetParamInfo(param))) { - Func deserializer = GetDeserializer(identity, reader); + Func deserializer = GetDeserializer(identity, reader); while (reader.Read()) { - list.Add(deserializer(reader)); + yield return deserializer(reader); } } - return list; } /// - /// Return a typed list of objects, reader is closed after the call + /// Enumerates the query, keeping the reader open after it is called. Use when iterating through huge result sets. You should usually use ExecuteMapperQuery instead /// - public static List ExecuteMapperQuery(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null) + static IEnumerable EnumerateMapperQuery(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null) { - var identity = new Identity(sql, cnn, typeof(T)); - var rval = new List(); - + var identity = new Identity(sql, cnn, DynamicStub.Type); using (var reader = GetReader(cnn, transaction, sql, GetParamInfo(param))) { - Func deserializer = GetDeserializer(identity, reader); + Func deserializer = GetDeserializer(identity, reader); while (reader.Read()) { - rval.Add(deserializer(reader)); + yield return deserializer(reader); } } - return rval; - } - - public static List ExecuteMapperQuery(this IDbConnection cnn, string sql, Action map, object param = null, IDbTransaction transaction = null) - { - return null; } - private static Func GetDeserializer(Identity identity, IDataReader reader) + static Func GetDeserializer(Identity identity, IDataReader reader) { object oDeserializer; if (!cachedSerializers.TryGetValue(identity, out oDeserializer)) diff --git a/Tests/PerformanceTests.cs b/Tests/PerformanceTests.cs index bfadf53..d054c76 100644 --- a/Tests/PerformanceTests.cs +++ b/Tests/PerformanceTests.cs @@ -104,10 +104,10 @@ public void Run(int iterations) tests.Add(id => entityContext.Posts.First(p => p.Id == id), "Entity framework No Tracking"); var mapperConnection = Program.GetOpenConnection(); - tests.Add(id => mapperConnection.ExecuteMapperQuery("select * from Posts where Id = @Id", new { Id = id }).ToList(), "Mapper Query"); + tests.Add(id => mapperConnection.Query("select * from Posts where Id = @Id", new { Id = id }).ToList(), "Mapper Query"); var mapperConnection2 = Program.GetOpenConnection(); - tests.Add(id => mapperConnection2.ExecuteMapperQuery("select * from Posts where Id = @Id", new { Id = id }).ToList(), "Dynamic Mapper Query"); + tests.Add(id => mapperConnection2.Query("select * from Posts where Id = @Id", new { Id = id }).ToList(), "Dynamic Mapper Query"); var massiveModel = new DynamicModel(Program.connectionString); var massiveConnection = Program.GetOpenConnection(); diff --git a/Tests/Tests.cs b/Tests/Tests.cs index 02cf623..db21a3a 100644 --- a/Tests/Tests.cs +++ b/Tests/Tests.cs @@ -58,32 +58,32 @@ class Tests public void SelectListInt() { - connection.ExecuteMapperQuery("select 1 union all select 2 union all select 3") + connection.Query("select 1 union all select 2 union all select 3") .IsSequenceEqualTo(new[] { 1, 2, 3 }); } public void PassInIntArray() { - connection.ExecuteMapperQuery("select * from (select 1 as Id union all select 2 union all select 3) as X where Id in @Ids", new { Ids = new int[] { 1, 2, 3 }.AsEnumerable() }) + connection.Query("select * from (select 1 as Id union all select 2 union all select 3) as X where Id in @Ids", new { Ids = new int[] { 1, 2, 3 }.AsEnumerable() }) .IsSequenceEqualTo(new[] { 1, 2, 3 }); } public void TestDoubleParam() { - connection.ExecuteMapperQuery("select @d", new { d = 0.1d }).First() + connection.Query("select @d", new { d = 0.1d }).First() .IsEqualTo(0.1d); } public void TestBoolParam() { - connection.ExecuteMapperQuery("select @b", new { b = false }).First() + connection.Query("select @b", new { b = false }).First() .IsFalse(); } public void TestStrings() { - connection.ExecuteMapperQuery(@"select 'a' a union select 'b'") + connection.Query(@"select 'a' a union select 'b'") .IsSequenceEqualTo(new[] { "a", "b" }); } @@ -100,7 +100,7 @@ public class Dog public void TestExtraFields() { var guid = Guid.NewGuid(); - var dog = connection.ExecuteMapperQuery("select '' as Extra, 1 as Age, 0.1 as Name1 , Id = @id", new { Id = guid}); + var dog = connection.Query("select '' as Extra, 1 as Age, 0.1 as Name1 , Id = @id", new { Id = guid}); dog.Count() .IsEqualTo(1); @@ -116,7 +116,7 @@ public void TestExtraFields() public void TestStrongType() { var guid = Guid.NewGuid(); - var dog = connection.ExecuteMapperQuery("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid }); + var dog = connection.Query("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid }); dog.Count() .IsEqualTo(1); @@ -130,13 +130,13 @@ public void TestStrongType() public void TestSimpleNull() { - connection.ExecuteMapperQuery("select null").First().IsNull(); + connection.Query("select null").First().IsNull(); } public void TestExpando() { - var rows = connection.ExecuteMapperQuery("select 1 A, 2 B union all select 3, 4"); - + var rows = connection.Query("select 1 A, 2 B union all select 3, 4").ToList(); + ((int)rows[0].A) .IsEqualTo(1); @@ -152,13 +152,13 @@ public void TestExpando() public void TestStringList() { - connection.ExecuteMapperQuery("select * from (select 'a' as x union all select 'b' union all select 'c') as T where x in @strings", new {strings = new[] {"a","b","c"}}) + connection.Query("select * from (select 'a' as x union all select 'b' union all select 'c') as T where x in @strings", new {strings = new[] {"a","b","c"}}) .IsSequenceEqualTo(new[] {"a","b","c"}); } public void TestExecuteCommand() { - connection.ExecuteMapperCommand(@" + connection.Execute(@" set nocount on create table #t(i int) set nocount off @@ -171,7 +171,7 @@ public void TestExecuteCommand() public void TestMassiveStrings() { var str = new string('X', 20000); - connection.ExecuteMapperQuery("select @a", new { a = str }).First() + connection.Query("select @a", new { a = str }).First() .IsEqualTo(str); } @@ -186,21 +186,21 @@ class TestObj public void TestSetInternal() { - connection.ExecuteMapperQuery("select 10 as [Internal]").First()._internal.IsEqualTo(10); + connection.Query("select 10 as [Internal]").First()._internal.IsEqualTo(10); } public void TestSetPrivate() { - connection.ExecuteMapperQuery("select 10 as [Priv]").First()._priv.IsEqualTo(10); + connection.Query("select 10 as [Priv]").First()._priv.IsEqualTo(10); } public void TestEnumeration() { - var en = connection.EnumerateMapperQuery("select 1 as one"); + var en = connection.Query("select 1 as one", buffered: false); bool gotException = false; try { - connection.EnumerateMapperQuery("select 1 as one"); + connection.Query("select 1 as one", buffered: false); } catch (Exception) { @@ -210,18 +210,18 @@ public void TestEnumeration() var realItems = en.ToList(); // should not exception, since enumertated - en = connection.EnumerateMapperQuery("select 1 as one"); + en = connection.Query("select 1 as one", buffered: false); gotException.IsTrue(); } public void TestEnumerationDynamic() { - var en = connection.EnumerateMapperQuery("select 1 as one"); + var en = connection.Query("select 1 as one", buffered: false); bool gotException = false; try { - connection.EnumerateMapperQuery("select 1 as one"); + connection.Query("select 1 as one", buffered: false); } catch (Exception) { @@ -232,7 +232,7 @@ public void TestEnumerationDynamic() i.IsEqualTo(1); // should not exception, since enumertated - en = connection.EnumerateMapperQuery("select 1 as one"); + en = connection.Query("select 1 as one",buffered:false); gotException.IsTrue(); } @@ -252,7 +252,7 @@ class Post public void TestMultiMap() { - var test = connection.ExecuteMapperQuery("select * from Posts p left join Users u on u.Id = p.OwnerId"); + var test = connection.Query("select * from Posts p left join Users u on u.Id = p.OwnerId", (post, user) => { post.Owner = user; }); } } } -- GitLab