@@ -64,55 +64,22 @@ public static async Task ExecuteStoredProcedureAsync(this DatabaseFacade databas
6464 /// <param name="database">The database to execute against.</param>
6565 /// <param name="storedProcedure">The stored procedure to execute.</param>
6666 /// <returns></returns>
67- public static IEnumerable < T > ExecuteStoredProcedure < T > ( this DatabaseFacade database , object storedProcedure )
67+ public static IEnumerable < T > ExecuteStoredProcedure < T > ( this DatabaseFacade database , object storedProcedure ) where T : class
6868 {
6969 if ( storedProcedure == null )
70- throw new ArgumentNullException ( "storedProcedure" ) ;
71-
70+ throw new ArgumentNullException ( "storedProcedure" ) ;
7271
73- List < T > result = new List < T > ( ) ;
7472 var info = StoredProcedureParser . BuildStoredProcedureInfo ( storedProcedure ) ;
7573
74+ var contextField = database . GetType ( ) . GetField ( "_context" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
7675
77- // from : https://github.com/Fodsuk/EntityFrameworkExtras/pull/23/commits/dce354304aa9a95750f7d2559d1b002444ac46f7
78- using ( var command = database . GetDbConnection ( ) . CreateCommand ( ) )
79- {
80- command . CommandText = info . Sql ;
81- int ? commandTimeout = database . GetCommandTimeout ( ) ;
82- if ( commandTimeout . HasValue )
83- {
84- command . CommandTimeout = commandTimeout . Value ;
85- }
86- command . CommandType = CommandType . Text ;
87- command . Parameters . AddRange ( info . SqlParameters ) ;
88- command . Transaction = database . CurrentTransaction ? . GetDbTransaction ( ) ;
89- database . OpenConnection ( ) ;
90-
91- using ( var resultReader = command . ExecuteReader ( ) )
92- {
93- T obj = default ( T ) ;
94-
95- while ( resultReader . Read ( ) )
96- {
97- obj = Activator . CreateInstance < T > ( ) ;
98- foreach ( PropertyInfo prop in obj . GetType ( ) . GetProperties ( ) )
99- {
100- var val = GetValue ( resultReader , prop . Name ) ;
101- if ( ! object . Equals ( val , DBNull . Value ) )
102- {
103- prop . SetValue ( obj , val , null ) ;
104- }
105- }
106-
107- result . Add ( obj ) ;
108- }
109- }
110-
111- }
76+ var context = ( DbContext ) contextField . GetValue ( database ) ;
11277
113- SetOutputParameterValues ( info . SqlParameters , storedProcedure ) ;
78+ List < T > result = context . Set < T > ( ) . FromSqlRaw ( info . Sql , info . SqlParameters ) . AsNoTracking ( ) . ToList ( ) ;
79+
80+ SetOutputParameterValues ( info . SqlParameters , storedProcedure ) ;
11481
115- return result ;
82+ return result ;
11683 }
11784
11885 /// <summary>
@@ -124,51 +91,18 @@ public static IEnumerable<T> ExecuteStoredProcedure<T>(this DatabaseFacade datab
12491 /// <param name="storedProcedure">The stored procedure to execute.</param>
12592 /// <param name="cancellationToken">The cancellation token.</param>
12693 /// <returns></returns>
127- public static async Task < IEnumerable < T > > ExecuteStoredProcedureAsync < T > ( this DatabaseFacade database , object storedProcedure , CancellationToken cancellationToken = default )
94+ public static async Task < IEnumerable < T > > ExecuteStoredProcedureAsync < T > ( this DatabaseFacade database , object storedProcedure , CancellationToken cancellationToken = default ) where T : class
12895 {
12996 if ( storedProcedure == null )
13097 throw new ArgumentNullException ( "storedProcedure" ) ;
13198
132-
133- List < T > result = new List < T > ( ) ;
13499 var info = StoredProcedureParser . BuildStoredProcedureInfo ( storedProcedure ) ;
135100
101+ var contextField = database . GetType ( ) . GetField ( "_context" , BindingFlags . Instance | BindingFlags . NonPublic ) ;
102+
103+ var context = ( DbContext ) contextField . GetValue ( database ) ;
136104
137- // from : https://github.com/Fodsuk/EntityFrameworkExtras/pull/23/commits/dce354304aa9a95750f7d2559d1b002444ac46f7
138- using ( var command = database . GetDbConnection ( ) . CreateCommand ( ) )
139- {
140- command . CommandText = info . Sql ;
141- int ? commandTimeout = database . GetCommandTimeout ( ) ;
142- if ( commandTimeout . HasValue )
143- {
144- command . CommandTimeout = commandTimeout . Value ;
145- }
146- command . CommandType = CommandType . Text ;
147- command . Parameters . AddRange ( info . SqlParameters ) ;
148- command . Transaction = database . CurrentTransaction ? . GetDbTransaction ( ) ;
149- database . OpenConnection ( ) ;
150-
151- using ( var resultReader = await command . ExecuteReaderAsync ( cancellationToken ) . ConfigureAwait ( false ) )
152- {
153- T obj = default ( T ) ;
154-
155- while ( await resultReader . ReadAsync ( cancellationToken ) . ConfigureAwait ( false ) )
156- {
157- obj = Activator . CreateInstance < T > ( ) ;
158- foreach ( PropertyInfo prop in obj . GetType ( ) . GetProperties ( ) )
159- {
160- var val = GetValue ( resultReader , prop . Name ) ;
161- if ( ! object . Equals ( val , DBNull . Value ) )
162- {
163- prop . SetValue ( obj , val , null ) ;
164- }
165- }
166-
167- result . Add ( obj ) ;
168- }
169- }
170-
171- }
105+ List < T > result = await context . Set < T > ( ) . FromSqlRaw ( info . Sql , info . SqlParameters ) . AsNoTracking ( ) . ToListAsync ( cancellationToken ) ;
172106
173107 SetOutputParameterValues ( info . SqlParameters , storedProcedure ) ;
174108
@@ -183,7 +117,7 @@ public static async Task<IEnumerable<T>> ExecuteStoredProcedureAsync<T>(this Dat
183117 /// <param name="database">The database to execute against.</param>
184118 /// <param name="storedProcedure">The stored procedure to execute.</param>
185119 /// <returns></returns>
186- public static T ExecuteStoredProcedureFirstOrDefault < T > ( this DatabaseFacade database , object storedProcedure )
120+ public static T ExecuteStoredProcedureFirstOrDefault < T > ( this DatabaseFacade database , object storedProcedure ) where T : class
187121 {
188122 return database . ExecuteStoredProcedure < T > ( storedProcedure ) . FirstOrDefault ( ) ;
189123 }
@@ -197,7 +131,7 @@ public static T ExecuteStoredProcedureFirstOrDefault<T>(this DatabaseFacade data
197131 /// <param name="storedProcedure">The stored procedure to execute.</param>
198132 /// <param name="cancellationToken">The cancellation token.</param>
199133 /// <returns></returns>
200- public static async Task < T > ExecuteStoredProcedureFirstOrDefaultAsync < T > ( this DatabaseFacade database , object storedProcedure , CancellationToken cancellationToken = default )
134+ public static async Task < T > ExecuteStoredProcedureFirstOrDefaultAsync < T > ( this DatabaseFacade database , object storedProcedure , CancellationToken cancellationToken = default ) where T : class
201135 {
202136 var executed = await database . ExecuteStoredProcedureAsync < T > ( storedProcedure , cancellationToken ) . ConfigureAwait ( false ) ;
203137
0 commit comments