Skip to content

Commit 1034900

Browse files
author
zzzprojects
committed
Update to v1.4.13
Update to v1.4.13
1 parent 0722804 commit 1034900

File tree

28 files changed

+536
-184
lines changed

28 files changed

+536
-184
lines changed

src/Z.EntityFramework.Plus.EF5.NET40/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@
1818
[assembly: AssemblyCulture("")]
1919
[assembly: ComVisible(false)]
2020
[assembly: Guid("e4c2af73-caeb-4429-bcb6-0a359484e064")]
21-
[assembly: AssemblyVersion("1.4.11")]
22-
[assembly: AssemblyFileVersion("1.4.11")]
21+
[assembly: AssemblyVersion("1.4.12")]
22+
[assembly: AssemblyFileVersion("1.4.12")]

src/Z.EntityFramework.Plus.EF5.NET40/QueryIncludeOptimized/QueryIncludeOptimizedParentQueryable`.cs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,28 @@ public IEnumerable<T> CreateEnumerable()
122122
#endif
123123
var newQuery = OriginalQueryable.AddToRootOrAppendOrderBy(keyNames).Select(x => x);
124124

125-
foreach (var child in Childs)
125+
List<T> list;
126+
127+
if (QueryIncludeOptimizedManager.AllowQueryBatch)
126128
{
127-
child.CreateIncludeQuery(newQuery);
129+
var future = newQuery.Future();
130+
131+
foreach (var child in Childs)
132+
{
133+
child.CreateIncludeQuery(newQuery);
134+
}
135+
136+
list = future.ToList();
128137
}
138+
else
139+
{
140+
list = newQuery.ToList();
129141

130-
// RESOLVE current and all future child queries
131-
var list = QueryIncludeOptimizedManager.AllowQueryBatch ? newQuery.Future().ToList() : newQuery.ToList();
142+
foreach (var child in Childs)
143+
{
144+
child.CreateIncludeQuery(newQuery);
145+
}
146+
}
132147

133148
#if EF6
134149
// FIX lazy loading

src/Z.EntityFramework.Plus.EF5.NET40/QueryIncludeOptimized/QueryIncludeOptimizedProvider.cs

Lines changed: 59 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -151,38 +151,13 @@ public TResult Execute<TResult>(Expression expression)
151151
arguments.RemoveAt(1);
152152
}
153153

154-
// RESOLVE child queries using .Future()
155-
{
156-
// MODIFY query if necessary
157-
#if EF5 || EF6
158-
var objectContext = CurrentQueryable.OriginalQueryable.GetObjectQuery().Context;
159-
var keyMembers = ((dynamic) objectContext).CreateObjectSet<T>().EntitySet.ElementType.KeyMembers;
160-
var keyNames = ((IEnumerable<EdmMember>) keyMembers).Select(x => x.Name).ToArray();
161-
#elif EFCORE
162-
163-
var context = currentQuery.OriginalQueryable.GetDbContext();
164-
165-
var keyNames = context.Model.FindEntityType(typeof (TResult).DisplayName(true))
166-
.GetKeys().ToList()[0]
167-
.Properties.Select(x => x.Name).ToArray();
168-
#endif
169-
170-
var currentNewQuery = methodCall.Method.Name == "First" || methodCall.Method.Name == "FirstOrDefault" ?
171-
currentQuery.AddToRootOrAppendOrderBy(keyNames).Take(1) :
172-
methodCall.Method.Name == "Last" || methodCall.Method.Name == "LastOrDefault" ?
173-
currentQuery.AddToRootOrAppendOrderBy(keyNames).Reverse().Take(1) :
174-
currentQuery;
175-
176-
currentQuery.CreateQueryable(currentNewQuery);
177-
}
178-
179154
// RESOLE parent queries using .FutureValue();
180155
#if EF5 || EF6
181156
var objectQuery = CurrentQueryable.OriginalQueryable.GetObjectQuery();
182-
157+
183158
// GET provider
184-
var objectQueryProviderField = typeof (ObjectQuery).GetField("_provider", BindingFlags.NonPublic | BindingFlags.Instance);
185-
var provider = (IQueryProvider) objectQueryProviderField.GetValue(objectQuery);
159+
var objectQueryProviderField = typeof (ObjectQuery).GetProperty("ObjectQueryProvider", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
160+
var provider = (IQueryProvider) objectQueryProviderField.GetValue(objectQuery, null);
186161

187162
// CREATE query from the expression
188163
var createQueryMethod = provider.GetType().GetMethod("CreateQuery", BindingFlags.NonPublic | BindingFlags.Instance, null, new[] {typeof (Expression)}, null);
@@ -198,12 +173,67 @@ public TResult Execute<TResult>(Expression expression)
198173

199174
if (QueryIncludeOptimizedManager.AllowQueryBatch)
200175
{
201-
value = immediateQuery.FutureValue().Value;
176+
var futureValue = immediateQuery.FutureValue();
177+
178+
// RESOLVE child queries using .Future()
179+
{
180+
// MODIFY query if necessary
181+
#if EF5 || EF6
182+
var objectContext = CurrentQueryable.OriginalQueryable.GetObjectQuery().Context;
183+
var keyMembers = ((dynamic)objectContext).CreateObjectSet<T>().EntitySet.ElementType.KeyMembers;
184+
var keyNames = ((IEnumerable<EdmMember>)keyMembers).Select(x => x.Name).ToArray();
185+
#elif EFCORE
186+
187+
var context = currentQuery.OriginalQueryable.GetDbContext();
188+
189+
var keyNames = context.Model.FindEntityType(typeof (TResult).DisplayName(true))
190+
.GetKeys().ToList()[0]
191+
.Properties.Select(x => x.Name).ToArray();
192+
#endif
193+
194+
var currentNewQuery = methodCall.Method.Name == "First" || methodCall.Method.Name == "FirstOrDefault" ?
195+
currentQuery.AddToRootOrAppendOrderBy(keyNames).Take(1) :
196+
methodCall.Method.Name == "Last" || methodCall.Method.Name == "LastOrDefault" ?
197+
currentQuery.AddToRootOrAppendOrderBy(keyNames).Reverse().Take(1) :
198+
currentQuery;
199+
200+
currentQuery.CreateQueryable(currentNewQuery);
201+
}
202+
203+
value = futureValue.Value;
202204
}
203205
else
204206
{
205207
value = immediateQuery.Execute(objectQuery.MergeOption).FirstOrDefault();
208+
209+
// RESOLVE child queries using .Future()
210+
{
211+
// MODIFY query if necessary
212+
#if EF5 || EF6
213+
var objectContext = CurrentQueryable.OriginalQueryable.GetObjectQuery().Context;
214+
var keyMembers = ((dynamic)objectContext).CreateObjectSet<T>().EntitySet.ElementType.KeyMembers;
215+
var keyNames = ((IEnumerable<EdmMember>)keyMembers).Select(x => x.Name).ToArray();
216+
#elif EFCORE
217+
218+
var context = currentQuery.OriginalQueryable.GetDbContext();
219+
220+
var keyNames = context.Model.FindEntityType(typeof (TResult).DisplayName(true))
221+
.GetKeys().ToList()[0]
222+
.Properties.Select(x => x.Name).ToArray();
223+
#endif
224+
225+
var currentNewQuery = methodCall.Method.Name == "First" || methodCall.Method.Name == "FirstOrDefault" ?
226+
currentQuery.AddToRootOrAppendOrderBy(keyNames).Take(1) :
227+
methodCall.Method.Name == "Last" || methodCall.Method.Name == "LastOrDefault" ?
228+
currentQuery.AddToRootOrAppendOrderBy(keyNames).Reverse().Take(1) :
229+
currentQuery;
230+
231+
currentQuery.CreateQueryable(currentNewQuery);
232+
}
233+
206234
}
235+
236+
207237
// EXECUTE the new expression
208238
//var value = QueryIncludeOptimizedManager.AllowQueryBatch ? immediateQuery.FutureValue().Value : immediateQuery.FirstOrDefault();
209239

src/Z.EntityFramework.Plus.EF5/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@
1818
[assembly: AssemblyCulture("")]
1919
[assembly: ComVisible(false)]
2020
[assembly: Guid("abcbb878-043c-4957-a334-90e9872e684e")]
21-
[assembly: AssemblyVersion("1.4.11")]
22-
[assembly: AssemblyFileVersion("1.4.11")]
21+
[assembly: AssemblyVersion("1.4.12")]
22+
[assembly: AssemblyFileVersion("1.4.12")]

src/Z.EntityFramework.Plus.EF5/QueryIncludeOptimized/QueryIncludeOptimizedParentQueryable`.cs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,28 @@ public IEnumerable<T> CreateEnumerable()
122122
#endif
123123
var newQuery = OriginalQueryable.AddToRootOrAppendOrderBy(keyNames).Select(x => x);
124124

125-
foreach (var child in Childs)
125+
List<T> list;
126+
127+
if (QueryIncludeOptimizedManager.AllowQueryBatch)
126128
{
127-
child.CreateIncludeQuery(newQuery);
129+
var future = newQuery.Future();
130+
131+
foreach (var child in Childs)
132+
{
133+
child.CreateIncludeQuery(newQuery);
134+
}
135+
136+
list = future.ToList();
128137
}
138+
else
139+
{
140+
list = newQuery.ToList();
129141

130-
// RESOLVE current and all future child queries
131-
var list = QueryIncludeOptimizedManager.AllowQueryBatch ? newQuery.Future().ToList() : newQuery.ToList();
142+
foreach (var child in Childs)
143+
{
144+
child.CreateIncludeQuery(newQuery);
145+
}
146+
}
132147

133148
#if EF6
134149
// FIX lazy loading

src/Z.EntityFramework.Plus.EF5/QueryIncludeOptimized/QueryIncludeOptimizedProvider.cs

Lines changed: 58 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -151,37 +151,12 @@ public TResult Execute<TResult>(Expression expression)
151151
arguments.RemoveAt(1);
152152
}
153153

154-
// RESOLVE child queries using .Future()
155-
{
156-
// MODIFY query if necessary
157-
#if EF5 || EF6
158-
var objectContext = CurrentQueryable.OriginalQueryable.GetObjectQuery().Context;
159-
var keyMembers = ((dynamic) objectContext).CreateObjectSet<T>().EntitySet.ElementType.KeyMembers;
160-
var keyNames = ((IEnumerable<EdmMember>) keyMembers).Select(x => x.Name).ToArray();
161-
#elif EFCORE
162-
163-
var context = currentQuery.OriginalQueryable.GetDbContext();
164-
165-
var keyNames = context.Model.FindEntityType(typeof (TResult).DisplayName(true))
166-
.GetKeys().ToList()[0]
167-
.Properties.Select(x => x.Name).ToArray();
168-
#endif
169-
170-
var currentNewQuery = methodCall.Method.Name == "First" || methodCall.Method.Name == "FirstOrDefault" ?
171-
currentQuery.AddToRootOrAppendOrderBy(keyNames).Take(1) :
172-
methodCall.Method.Name == "Last" || methodCall.Method.Name == "LastOrDefault" ?
173-
currentQuery.AddToRootOrAppendOrderBy(keyNames).Reverse().Take(1) :
174-
currentQuery;
175-
176-
currentQuery.CreateQueryable(currentNewQuery);
177-
}
178-
179154
// RESOLE parent queries using .FutureValue();
180155
#if EF5 || EF6
181156
var objectQuery = CurrentQueryable.OriginalQueryable.GetObjectQuery();
182-
157+
183158
// GET provider
184-
var objectQueryProviderField = typeof (ObjectQuery).GetField("_provider", BindingFlags.NonPublic | BindingFlags.Instance);
159+
var objectQueryProviderField = typeof (ObjectQuery).GetProperty("ObjectQueryProvider", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
185160
var provider = (IQueryProvider) objectQueryProviderField.GetValue(objectQuery);
186161

187162
// CREATE query from the expression
@@ -198,12 +173,67 @@ public TResult Execute<TResult>(Expression expression)
198173

199174
if (QueryIncludeOptimizedManager.AllowQueryBatch)
200175
{
201-
value = immediateQuery.FutureValue().Value;
176+
var futureValue = immediateQuery.FutureValue();
177+
178+
// RESOLVE child queries using .Future()
179+
{
180+
// MODIFY query if necessary
181+
#if EF5 || EF6
182+
var objectContext = CurrentQueryable.OriginalQueryable.GetObjectQuery().Context;
183+
var keyMembers = ((dynamic)objectContext).CreateObjectSet<T>().EntitySet.ElementType.KeyMembers;
184+
var keyNames = ((IEnumerable<EdmMember>)keyMembers).Select(x => x.Name).ToArray();
185+
#elif EFCORE
186+
187+
var context = currentQuery.OriginalQueryable.GetDbContext();
188+
189+
var keyNames = context.Model.FindEntityType(typeof (TResult).DisplayName(true))
190+
.GetKeys().ToList()[0]
191+
.Properties.Select(x => x.Name).ToArray();
192+
#endif
193+
194+
var currentNewQuery = methodCall.Method.Name == "First" || methodCall.Method.Name == "FirstOrDefault" ?
195+
currentQuery.AddToRootOrAppendOrderBy(keyNames).Take(1) :
196+
methodCall.Method.Name == "Last" || methodCall.Method.Name == "LastOrDefault" ?
197+
currentQuery.AddToRootOrAppendOrderBy(keyNames).Reverse().Take(1) :
198+
currentQuery;
199+
200+
currentQuery.CreateQueryable(currentNewQuery);
201+
}
202+
203+
value = futureValue.Value;
202204
}
203205
else
204206
{
205207
value = immediateQuery.Execute(objectQuery.MergeOption).FirstOrDefault();
208+
209+
// RESOLVE child queries using .Future()
210+
{
211+
// MODIFY query if necessary
212+
#if EF5 || EF6
213+
var objectContext = CurrentQueryable.OriginalQueryable.GetObjectQuery().Context;
214+
var keyMembers = ((dynamic)objectContext).CreateObjectSet<T>().EntitySet.ElementType.KeyMembers;
215+
var keyNames = ((IEnumerable<EdmMember>)keyMembers).Select(x => x.Name).ToArray();
216+
#elif EFCORE
217+
218+
var context = currentQuery.OriginalQueryable.GetDbContext();
219+
220+
var keyNames = context.Model.FindEntityType(typeof (TResult).DisplayName(true))
221+
.GetKeys().ToList()[0]
222+
.Properties.Select(x => x.Name).ToArray();
223+
#endif
224+
225+
var currentNewQuery = methodCall.Method.Name == "First" || methodCall.Method.Name == "FirstOrDefault" ?
226+
currentQuery.AddToRootOrAppendOrderBy(keyNames).Take(1) :
227+
methodCall.Method.Name == "Last" || methodCall.Method.Name == "LastOrDefault" ?
228+
currentQuery.AddToRootOrAppendOrderBy(keyNames).Reverse().Take(1) :
229+
currentQuery;
230+
231+
currentQuery.CreateQueryable(currentNewQuery);
232+
}
233+
206234
}
235+
236+
207237
// EXECUTE the new expression
208238
//var value = QueryIncludeOptimizedManager.AllowQueryBatch ? immediateQuery.FutureValue().Value : immediateQuery.FirstOrDefault();
209239

src/Z.EntityFramework.Plus.EF6.NET40/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@
1818
[assembly: AssemblyCulture("")]
1919
[assembly: ComVisible(false)]
2020
[assembly: Guid("ac398eb8-0a31-4d06-a804-84d10b6da96d")]
21-
[assembly: AssemblyVersion("1.4.11")]
22-
[assembly: AssemblyFileVersion("1.4.11")]
21+
[assembly: AssemblyVersion("1.4.13")]
22+
[assembly: AssemblyFileVersion("1.4.13")]

src/Z.EntityFramework.Plus.EF6.NET40/QueryFilter/QueryFilter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public override object ApplyFilter<TEntity>(object query)
4040
// TODO: Use the same code as (EF5 || EF6) once EF team fix the cast issue: https://github.com/aspnet/EntityFramework/issues/3736
4141
if(QueryFilterManager.ForceCast)
4242
{
43-
return return Filter((IQueryable<T>) query).Cast<TEntity>();
43+
return Filter((IQueryable<T>) query).Cast<TEntity>();
4444
}
4545

4646
return Filter((IQueryable<T>) query);

src/Z.EntityFramework.Plus.EF6.NET40/QueryFilterInterceptor/QueryFilterInterceptorContext.cs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,60 @@ private void Initialize(DbContext context)
200200
}
201201
}
202202
}
203+
204+
foreach (var type in QueryFilterManager.Types)
205+
{
206+
var setMethod = context.GetType().GetMethod("Set", new Type[0]);
207+
var dbSet = setMethod.MakeGenericMethod(type).Invoke(context, null);
208+
209+
Type elementType = type;
210+
211+
// DbSet<>.InternalQuery
212+
var internalQueryProperty = typeof(DbQuery<>).MakeGenericType(elementType).GetProperty("InternalQuery", BindingFlags.NonPublic | BindingFlags.Instance);
213+
var internalQuery = internalQueryProperty.GetValue(dbSet, null);
214+
215+
// DbSet<>.InternalQuery.EntitySet
216+
var entitySetProperty = internalQuery.GetType().GetProperty("EntitySet", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
217+
var entitySet = (EntitySet)entitySetProperty.GetValue(internalQuery, null);
218+
219+
var entityTypebase = entitySet.ElementType.FullName;
220+
221+
// TypeByEntitySetBase
222+
{
223+
if (!TypeByEntitySetBase.ContainsKey(entityTypebase))
224+
{
225+
TypeByEntitySetBase.Add(entityTypebase, elementType);
226+
}
227+
}
228+
229+
// TypeByDbSet
230+
{
231+
var baseType = elementType;
232+
233+
var types = new List<Type>();
234+
while (baseType != null && baseType != typeof(object))
235+
{
236+
types.Add(baseType);
237+
238+
// LINK interface
239+
var interfaces = baseType.GetInterfaces();
240+
foreach (var @interface in interfaces)
241+
{
242+
types.Add(@interface);
243+
}
244+
245+
baseType = baseType.BaseType;
246+
}
247+
248+
// ENSURE all discting
249+
types = types.Distinct().ToList();
250+
251+
if (!TypeByDbSet.ContainsKey(entityTypebase))
252+
{
253+
TypeByDbSet.Add(entityTypebase, types);
254+
}
255+
}
256+
}
203257
}
204258
}
205259
}

src/Z.EntityFramework.Plus.EF6.NET40/QueryFilterInterceptor/QueryFilterInterceptorDbCommandTree.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public class QueryFilterInterceptorDbCommandTree : IDbCommandTreeInterceptor
1818
/// <param name="interceptionContext">Contextual information associated with the call.</param>
1919
public void TreeCreated(DbCommandTreeInterceptionContext interceptionContext)
2020
{
21+
2122
var dbQueryCommandTree = interceptionContext.Result as DbQueryCommandTree;
2223
if (dbQueryCommandTree != null && interceptionContext.DbContexts.Count() == 1)
2324
{

0 commit comments

Comments
 (0)