Skip to content

Commit 0722804

Browse files
author
zzzprojects
committed
Fix LazyLoading (Null Reference), IncludeOptimized AddOAppend
Fix LazyLoading (Null Reference), IncludeOptimized AddOAppend
1 parent 288ee05 commit 0722804

File tree

82 files changed

+568
-267
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+568
-267
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.10")]
22-
[assembly: AssemblyFileVersion("1.4.10")]
21+
[assembly: AssemblyVersion("1.4.11")]
22+
[assembly: AssemblyFileVersion("1.4.11")]

src/Z.EntityFramework.Plus.EF5.NET40/QueryExtensions/QueryAddOrAppendOrder/Extensions/IQueryable`.AddOrAppendOrderByDescending.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ public static IQueryable<T> AddOrAppendOrderByDescending<T, TKey>(this IQueryabl
2727

2828
public static IQueryable<TSource> AddOrAppendOrderByDescending<TSource, TKey>(this IQueryable<TSource> query, Expression<Func<TSource, TKey>> keySelector)
2929
{
30-
return new QueryAddOrAppendOrderExpressionVisitor<TSource, TKey>().OrderBy(query, keySelector);
30+
return new QueryAddOrAppendOrderExpressionVisitor<TSource, TKey>().OrderByDescending(query, keySelector);
3131
}
3232

3333
public static IQueryable<TSource> AddOrAppendOrderByDescending<TSource, TKey>(this IQueryable<TSource> query, Expression<Func<TSource, TKey>> keySelector, IComparer<TKey> comparer)
3434
{
35-
return new QueryAddOrAppendOrderExpressionVisitor<TSource, TKey>().OrderBy(query, keySelector, comparer);
35+
return new QueryAddOrAppendOrderExpressionVisitor<TSource, TKey>().OrderByDescending(query, keySelector, comparer);
3636
}
3737
}
3838
}

src/Z.EntityFramework.Plus.EF5.NET40/QueryExtensions/QueryAddOrAppendOrder/QueryAddOrAppendOrderExpressionVisitor`.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ protected override Expression VisitMethodCall(MethodCallExpression node)
9797
}
9898
else
9999
{
100-
if (node.Method.Name == "MergeAs")
100+
if (node.Method.Name == "MergeAs" || node.Method.Name == "Select" || node.Method.Name == "SelectMany")
101101
{
102102
// ADD "OrderBy" | "ThenBy" to the query
103103
for (var i = 0; i < KeyNames.Length; i++)

src/Z.EntityFramework.Plus.EF5.NET40/QueryExtensions/QueryAddOrAppendOrder/QueryAddOrAppendOrderExpressionVisitor`2.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ private IQueryable<TSource> AddOrAppendOrderBy(IQueryable<TSource> query, Expres
6464
// VISIT expression to append "ThenBy" to the last "OrderBy", "OrderByDescending", "ThenBy", "ThenByDescending" method
6565
var expression = Visit(query.Expression);
6666

67-
if (expression == query.Expression)
67+
if (expression == query.Expression
68+
|| expression.ToString() == query.Expression.ToString())
6869
{
6970
// ADD "OrderBy" to the query
7071
query = Comparer == null ?

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@ public override object ApplyFilter<TEntity>(object query)
3838
return Filter((IQueryable<T>)query).Cast<TEntity>();
3939
#elif EFCORE
4040
// TODO: Use the same code as (EF5 || EF6) once EF team fix the cast issue: https://github.com/aspnet/EntityFramework/issues/3736
41-
//return Filter((IQueryable<T>) query).Cast<TEntity>();
41+
if(QueryFilterManager.ForceCast)
42+
{
43+
return return Filter((IQueryable<T>) query).Cast<TEntity>();
44+
}
45+
4246
return Filter((IQueryable<T>) query);
4347
#endif
4448
}

src/Z.EntityFramework.Plus.EF5.NET40/QueryFilter/QueryFilterManager.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ static QueryFilterManager()
3737
GlobalInitializeFilterActions = new List<Tuple<BaseQueryFilter, Action<BaseQueryFilter>>>();
3838
}
3939

40+
#if EFCORE
41+
/// <summary>Gets or sets if the method cast should be forced.</summary>
42+
/// <value>True if the method cast should be forced, otherwise false.</value>
43+
public static bool ForceCast { get; set; }
44+
#endif
45+
4046
/// <summary>Gets the global filters.</summary>
4147
/// <value>The global filters.</value>
4248
public static Dictionary<object, BaseQueryFilter> GlobalFilters { get; }

src/Z.EntityFramework.Plus.EF5.NET40/QueryFuture/BaseQueryFuture.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,26 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
123123
QueryConnection = new CreateEntityRelationConnection(connection);
124124

125125
// CREATE query context
126-
queryContext = new RelationalQueryContext(createQueryBufferDelegate, QueryConnection, stateManager, concurrencyDetector);
127-
126+
{
127+
var relationalQueryContextType = typeof(RelationalQueryContext);
128+
var relationalQueryContextConstructor = relationalQueryContextType.GetConstructors()[0];
129+
130+
// EF Core 1.1 preview
131+
if (relationalQueryContextConstructor.GetParameters().Length == 5)
132+
{
133+
// REFLECTION: Query.Provider._queryCompiler._queryContextFactory.ExecutionStrategyFactory
134+
var executionStrategyFactoryField = queryContextFactory.GetType().GetProperty("ExecutionStrategyFactory", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy);
135+
var executionStrategyFactory = executionStrategyFactoryField.GetValue(queryContextFactory);
136+
137+
var lazyRefStateManager = new LazyRef<IStateManager>(() => stateManager);
138+
139+
queryContext = (RelationalQueryContext)relationalQueryContextConstructor.Invoke(new object[] { createQueryBufferDelegate, QueryConnection, lazyRefStateManager, concurrencyDetector, executionStrategyFactory });
140+
}
141+
else
142+
{
143+
queryContext = (RelationalQueryContext) relationalQueryContextConstructor.Invoke(new object[] {createQueryBufferDelegate, QueryConnection, stateManager, concurrencyDetector});
144+
}
145+
}
128146

129147
// REFLECTION: Query.Provider._queryCompiler._database._queryCompilationContextFactory.Logger
130148
var loggerField = queryCompilationContextFactory.GetType().GetProperty("Logger", BindingFlags.NonPublic | BindingFlags.Instance);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public static void SetLazyLoaded(object currentItem, List<string> paths, int ind
7979

8080
var navigationProperty = (System.Data.Entity.Core.Metadata.Edm.NavigationProperty)navigationPropertyProperty.GetValue(related, null);
8181

82-
if (navigationProperty.Name == path)
82+
if (navigationProperty != null && navigationProperty.Name == path)
8383
{
8484
related.IsLoaded = true;
8585

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,11 @@ public IEnumerable<T> CreateEnumerable()
130130
// RESOLVE current and all future child queries
131131
var list = QueryIncludeOptimizedManager.AllowQueryBatch ? newQuery.Future().ToList() : newQuery.ToList();
132132

133+
#if EF6
134+
// FIX lazy loading
135+
QueryIncludeOptimizedLazyLoading.SetLazyLoaded(list, Childs);
136+
#endif
137+
133138
// FIX collection null
134139
QueryIncludeOptimizedNullCollection.NullCollectionToEmpty(list, Childs);
135140

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

Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -75,59 +75,5 @@ protected override Expression VisitLambda<T>(Expression<T> node)
7575

7676
return base.VisitLambda(node);
7777
}
78-
79-
80-
81-
//public Expression CurrentLambda;
82-
//public List<string> Paths = new List<string>();
83-
84-
//protected override Expression VisitLambda<T1>(Expression<T1> node)
85-
//{
86-
// if (node == CurrentLambda)
87-
// {
88-
// var memberExpression = node.Body as MemberExpression;
89-
// var methodCall = node.Body as MethodCallExpression;
90-
// if (memberExpression != null)
91-
// {
92-
// var currentExpression = (Expression) memberExpression;
93-
// var reverseList = new List<string>();
94-
// while (currentExpression is MemberExpression)
95-
// {
96-
// memberExpression = currentExpression as MemberExpression;
97-
// reverseList.Add(memberExpression.Member.Name);
98-
// currentExpression = memberExpression.Expression;
99-
// }
100-
101-
// reverseList.Reverse();
102-
// Paths.AddRange(reverseList);
103-
// }
104-
// else if (methodCall != null)
105-
// {
106-
// if (methodCall.Method.ReflectedType != null
107-
// && methodCall.Method.ReflectedType.FullName == "System.Linq.Enumerable"
108-
// && (methodCall.Method.Name == "Select"
109-
// || methodCall.Method.Name == "SelectMany"))
110-
// {
111-
// memberExpression = methodCall.Arguments[0] as MemberExpression;
112-
113-
// var currentExpression = (Expression) memberExpression;
114-
// var reverseList = new List<string>();
115-
// while (currentExpression is MemberExpression)
116-
// {
117-
// memberExpression = currentExpression as MemberExpression;
118-
// reverseList.Add(memberExpression.Member.Name);
119-
// currentExpression = memberExpression.Expression;
120-
// }
121-
122-
// reverseList.Reverse();
123-
// Paths.AddRange(reverseList);
124-
125-
// CurrentLambda = methodCall.Arguments[1];
126-
// }
127-
// }
128-
// }
129-
130-
// return base.VisitLambda(node);
131-
//}
13278
}
13379
}

0 commit comments

Comments
 (0)