Skip to content

Commit 95ebf63

Browse files
Merge pull request #120 from ksmithRenweb/pr/113b
Pr/113b
2 parents 69fb933 + f11c8a5 commit 95ebf63

File tree

5 files changed

+65
-18
lines changed

5 files changed

+65
-18
lines changed

src/Z.EntityFramework.Plus.EFCore/QueryFuture/BaseQueryFuture.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ namespace Z.EntityFramework.Plus
3737
#if QUERY_INCLUDEOPTIMIZED
3838
internal abstract class BaseQueryFuture
3939
#else
40-
public abstract class BaseQueryFuture
40+
public abstract class BaseQueryFuture<TResult> : IBaseQueryFuture
4141
#endif
4242
{
4343
/// <summary>Gets the value indicating whether the query future has a value.</summary>
@@ -55,7 +55,7 @@ public abstract class BaseQueryFuture
5555
#elif EFCORE
5656
/// <summary>Gets or sets the query deferred.</summary>
5757
/// <value>The query deferred.</value>
58-
public IQueryable Query { get; set; }
58+
public IQueryable<TResult> Query { get; set; }
5959

6060
/// <summary>Gets or sets the query deferred executor.</summary>
6161
/// <value>The query deferred executor.</value>
@@ -115,10 +115,6 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
115115
var connectionField = queryContextFactory.GetType().GetField("_connection", BindingFlags.NonPublic | BindingFlags.Instance);
116116
var connection = (IRelationalConnection) connectionField.GetValue(queryContextFactory);
117117

118-
// REFLECTION: Query.Provider._queryCompiler._database._queryCompilationContextFactory
119-
var queryCompilationContextFactoryField = typeof (Database).GetField("_queryCompilationContextFactory", BindingFlags.NonPublic | BindingFlags.Instance);
120-
var queryCompilationContextFactory = (IQueryCompilationContextFactory) queryCompilationContextFactoryField.GetValue(database);
121-
122118
// CREATE connection
123119
QueryConnection = new CreateEntityRelationConnection(connection);
124120

@@ -144,6 +140,10 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
144140
}
145141
}
146142

143+
// REFLECTION: Query.Provider._queryCompiler._database._queryCompilationContextFactory
144+
var queryCompilationContextFactoryField = typeof(Database).GetField("_queryCompilationContextFactory", BindingFlags.NonPublic | BindingFlags.Instance);
145+
var queryCompilationContextFactory = (IQueryCompilationContextFactory)queryCompilationContextFactoryField.GetValue(database);
146+
147147
// REFLECTION: Query.Provider._queryCompiler._database._queryCompilationContextFactory.Logger
148148
var loggerField = queryCompilationContextFactory.GetType().GetProperty("Logger", BindingFlags.NonPublic | BindingFlags.Instance);
149149
var logger = (ISensitiveDataLogger)loggerField.GetValue(queryCompilationContextFactory);
@@ -179,6 +179,11 @@ public virtual void SetResult(DbDataReader reader)
179179
{
180180
}
181181

182+
public virtual void GetResultDirectly()
183+
{
184+
185+
}
186+
182187
/// <summary>Sets the result of the query deferred.</summary>
183188
/// <param name="reader">The reader returned from the query execution.</param>
184189
public IEnumerator<T> GetQueryEnumerator<T>(DbDataReader reader)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using Microsoft.EntityFrameworkCore.Query;
2+
using Microsoft.EntityFrameworkCore.Storage;
3+
using System.Data.Common;
4+
5+
namespace Z.EntityFramework.Plus
6+
{
7+
public interface IBaseQueryFuture
8+
{
9+
void GetResultDirectly();
10+
void SetResult(DbDataReader reader);
11+
12+
IRelationalCommand CreateExecutorAndGetCommand(out RelationalQueryContext queryContext);
13+
}
14+
}

src/Z.EntityFramework.Plus.EFCore/QueryFuture/QueryFutureBatch.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public QueryFutureBatch(DbContext context)
4747
#endif
4848
{
4949
Context = context;
50-
Queries = new List<BaseQueryFuture>();
50+
Queries = new List<IBaseQueryFuture>();
5151
}
5252

5353
/// <summary>Gets or sets the context related to the query future batched.</summary>
@@ -60,11 +60,18 @@ public QueryFutureBatch(DbContext context)
6060

6161
/// <summary>Gets or sets deferred query lists waiting to be executed.</summary>
6262
/// <value>The deferred queries list waiting to be executed.</value>
63-
public List<BaseQueryFuture> Queries { get; set; }
63+
public List<IBaseQueryFuture> Queries { get; set; }
6464

6565
/// <summary>Executes deferred query lists.</summary>
6666
public void ExecuteQueries()
6767
{
68+
if (Queries.Count == 1)
69+
{
70+
Queries[0].GetResultDirectly();
71+
Queries.Clear();
72+
return;
73+
}
74+
6875
#if EF5 || EF6
6976
var connection = (EntityConnection) Context.Connection;
7077
#elif EFCORE

src/Z.EntityFramework.Plus.EFCore/QueryFuture/QueryFutureEnumerable.cs

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@
2222
namespace Z.EntityFramework.Plus
2323
{
2424
/// <summary>Class for query future value.</summary>
25-
/// <typeparam name="T">The type of elements of the query.</typeparam>
25+
/// <typeparam name="TResult">The type of elements of the query.</typeparam>
2626
#if QUERY_INCLUDEOPTIMIZED
2727
internal class QueryFutureEnumerable<T> : BaseQueryFuture, IEnumerable<T>
2828
#else
29-
public class QueryFutureEnumerable<T> : BaseQueryFuture, IEnumerable<T>
29+
public class QueryFutureEnumerable<TResult> : BaseQueryFuture<TResult>, IEnumerable<TResult>
3030
#endif
3131
{
3232
/// <summary>The result of the query future.</summary>
33-
private IEnumerable<T> _result;
33+
private IEnumerable<TResult> _result;
3434

3535
/// <summary>Constructor.</summary>
3636
/// <param name="ownerBatch">The batch that owns this item.</param>
@@ -41,7 +41,7 @@ public class QueryFutureEnumerable<T> : BaseQueryFuture, IEnumerable<T>
4141
#if EF5 || EF6
4242
public QueryFutureEnumerable(QueryFutureBatch ownerBatch, ObjectQuery<T> query)
4343
#elif EFCORE
44-
public QueryFutureEnumerable(QueryFutureBatch ownerBatch, IQueryable query)
44+
public QueryFutureEnumerable(QueryFutureBatch ownerBatch, IQueryable<TResult> query)
4545
#endif
4646
{
4747
OwnerBatch = ownerBatch;
@@ -50,7 +50,7 @@ public QueryFutureEnumerable(QueryFutureBatch ownerBatch, IQueryable query)
5050

5151
/// <summary>Gets the enumerator of the query future.</summary>
5252
/// <returns>The enumerator of the query future.</returns>
53-
public IEnumerator<T> GetEnumerator()
53+
public IEnumerator<TResult> GetEnumerator()
5454
{
5555
if (!HasValue)
5656
{
@@ -59,7 +59,7 @@ public IEnumerator<T> GetEnumerator()
5959

6060
if (_result == null)
6161
{
62-
return new List<T>().GetEnumerator();
62+
return new List<TResult>().GetEnumerator();
6363
}
6464

6565
return _result.GetEnumerator();
@@ -78,10 +78,15 @@ IEnumerator IEnumerable.GetEnumerator()
7878
/// <param name="reader">The reader returned from the query execution.</param>
7979
public override void SetResult(DbDataReader reader)
8080
{
81-
var enumerator = GetQueryEnumerator<T>(reader);
81+
var enumerator = GetQueryEnumerator<TResult>(reader);
8282

83+
SetResult(enumerator);
84+
}
85+
86+
private void SetResult(IEnumerator<TResult> enumerator)
87+
{
8388
// Enumerate on all items
84-
var list = new List<T>();
89+
var list = new List<TResult>();
8590
while (enumerator.MoveNext())
8691
{
8792
list.Add(enumerator.Current);
@@ -90,5 +95,12 @@ public override void SetResult(DbDataReader reader)
9095

9196
HasValue = true;
9297
}
98+
99+
public override void GetResultDirectly()
100+
{
101+
var enumerator = Query.GetEnumerator();
102+
103+
SetResult(enumerator);
104+
}
93105
}
94106
}

src/Z.EntityFramework.Plus.EFCore/QueryFuture/QueryFutureValue.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace Z.EntityFramework.Plus
2424
#if QUERY_INCLUDEOPTIMIZED
2525
internal class QueryFutureValue<TResult> : BaseQueryFuture
2626
#else
27-
public class QueryFutureValue<TResult> : BaseQueryFuture
27+
public class QueryFutureValue<TResult> : BaseQueryFuture<TResult>
2828
#endif
2929
{
3030
/// <summary>The result of the query future.</summary>
@@ -39,7 +39,7 @@ public class QueryFutureValue<TResult> : BaseQueryFuture
3939
#if EF5 || EF6
4040
public QueryFutureValue(QueryFutureBatch ownerBatch, ObjectQuery query)
4141
#elif EFCORE
42-
public QueryFutureValue(QueryFutureBatch ownerBatch, IQueryable query)
42+
public QueryFutureValue(QueryFutureBatch ownerBatch, IQueryable<TResult> query)
4343
#endif
4444
{
4545
OwnerBatch = ownerBatch;
@@ -73,5 +73,14 @@ public override void SetResult(DbDataReader reader)
7373

7474
HasValue = true;
7575
}
76+
77+
public override void GetResultDirectly()
78+
{
79+
var value = Query.Provider.Execute<TResult>(Query.Expression);
80+
81+
_result = value;
82+
83+
HasValue = true;
84+
}
7685
}
7786
}

0 commit comments

Comments
 (0)