Skip to content

Commit 436f20d

Browse files
author
zzzprojects
committed
Fix some issue
BatchDelete: FIX issue with EF Core + Multiple keys BatchDelete: Add support to ObjectContext BatchUpdate: Add support to ObjectContext QueryFilterInterceptor: Fix issue with Global Filter
1 parent 335b76f commit 436f20d

File tree

5 files changed

+46
-11
lines changed

5 files changed

+46
-11
lines changed

src/shared/Z.EF.Plus.BatchDelete.Shared/BatchDelete.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,7 @@ public DbCommand CreateCommand(IQueryable query, IEntityType entity)
592592

593593
if (isSqlServer)
594594
{
595+
List<Tuple<string, string>> propertyAndColumnName = new List<Tuple<string, string>>();
595596
var sqlServer = (IRelationalEntityTypeAnnotations)dynamicProviderEntityType.Invoke(null, new[] { entity });
596597

597598
// GET mapping
@@ -605,11 +606,14 @@ public DbCommand CreateCommand(IQueryable query, IEntityType entity)
605606
var mappingProperty = dynamicProviderProperty.Invoke(null, new[] { propertyKey });
606607

607608
var columnNameProperty = mappingProperty.GetType().GetProperty("ColumnName", BindingFlags.Public | BindingFlags.Instance);
608-
columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty));
609+
//columnKeys.Add((string)columnNameProperty.GetValue(mappingProperty));
610+
propertyAndColumnName.Add(new Tuple<string, string>(propertyKey.Name, (string)columnNameProperty.GetValue(mappingProperty)));
609611
}
610612

611613
// GET primary key join
612-
primaryKeys = string.Join(Environment.NewLine + "AND ", columnKeys.Select(x => string.Concat("A.[", x, "] = B.[", x, "]")));
614+
primaryKeys = propertyAndColumnName.Count > 1?
615+
string.Join(Environment.NewLine + "AND ", propertyAndColumnName.Select(x => string.Concat("A.[", x.Item2, "] = B.[", x.Item1, "]"))):
616+
string.Join(Environment.NewLine + "AND ", propertyAndColumnName.Select(x => string.Concat("A.[", x.Item2, "] = B.[", x.Item2, "]")));
613617
}
614618
else if (isPostgreSQL)
615619
{

src/shared/Z.EF.Plus.QueryFilterInterceptor.Shared/QueryFilterInterceptorDbScanExpression.cs

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,33 @@ public DbExpression ApplyFilter(DbExpression baseExpression, string fullName)
9898

9999
if (expression2 != null)
100100
{
101-
var visitor = new QueryFilterInterceptorDbProjectExpression();
102-
visitor.DbScanExpression = baseExpression;
103-
visitor.ParameterCollection = QueryFilterManager.DbExpressionParameterByHook[expression2];
101+
var baseExpressionProperty = baseExpression as DbPropertyExpression;
102+
NavigationProperty navProp = null;
103+
104+
if (baseExpressionProperty != null)
105+
{
106+
navProp = baseExpressionProperty.Property as NavigationProperty;
107+
}
108+
109+
if (QueryFilterManager.AllowPropertyFilter && navProp != null && !baseExpression.ResultType.ToString().Contains("Transient.collection["))
110+
{
111+
// Filter property
112+
expression2 = DbExpressionBuilder.Take(expression2, 1);
113+
expression2 = DbExpressionBuilder.Element(expression2);
104114

105-
var filetered = expression2.Accept(visitor);
106-
baseExpression = filetered;
115+
baseExpression = expression2;
116+
117+
}
118+
else
119+
{
120+
var visitor = new QueryFilterInterceptorDbProjectExpression();
121+
visitor.DbScanExpression = baseExpression;
122+
visitor.ParameterCollection = QueryFilterManager.DbExpressionParameterByHook[expression2];
123+
124+
var filetered = expression2.Accept(visitor);
125+
126+
baseExpression = filetered;
127+
}
107128
}
108129
}
109130
}

src/shared/Z.EF.Plus.QueryFuture.Shared/BaseQueryFuture.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,7 @@ public IEnumerator<T> GetQueryEnumerator<T>(DbDataReader reader)
310310
var enumerator = (IEnumerator<T>)getEnumerator;
311311
return enumerator;
312312
#elif EFCORE
313+
313314
((CreateEntityConnection)QueryConnection.DbConnection).OriginalDataReader = reader;
314315
var queryExecutor = (Func<QueryContext, IEnumerable<T>>) QueryExecutor;
315316
var queryEnumerable = queryExecutor(QueryContext);

src/shared/Z.EF.Plus.QueryIncludeOptimized.Shared/QueryIncludeOptimizedProvider.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,10 @@ public TResult Execute<TResult>(Expression expression)
168168
// RESOLE parent queries using .FutureValue();
169169
#if EF5 || EF6
170170
var objectQuery = CurrentQueryable.OriginalQueryable.GetObjectQuery();
171-
172-
// GET provider
173-
var objectQueryProviderField = typeof (ObjectQuery).GetProperty("ObjectQueryProvider", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
171+
172+
// GET provider
173+
// because IQueryable.Provider call : ObjectQueryProvider and now that work for EF5
174+
var objectQueryProviderField = typeof (ObjectQuery).GetProperty("System.Linq.IQueryable.Provider", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
174175
var provider = (IQueryProvider) objectQueryProviderField.GetValue(objectQuery, null);
175176

176177
// CREATE query from the expression

src/shared/Z.EF.Plus._Core.Shared/EF6/ObjectContext/GetDbContext.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,15 @@ public static DbContext GetDbContext(this ObjectContext context)
2626
{
2727
return null;
2828
}
29-
return interceptionContext.DbContexts.FirstOrDefault();
29+
30+
var dbContext = interceptionContext.DbContexts.FirstOrDefault();
31+
32+
if (dbContext == null)
33+
{
34+
dbContext = new DbContext(context, false);
35+
}
36+
37+
return dbContext;
3038
}
3139
}
3240
}

0 commit comments

Comments
 (0)