Skip to content

Commit e5d6565

Browse files
author
zzzprojects
committed
Fixed Audit Where + AllowPropertyFilter + EF Core with parameters
Fixed Audit Where + AllowPropertyFilter + EF Core with parameters
1 parent f6e17d5 commit e5d6565

File tree

7 files changed

+47
-14
lines changed

7 files changed

+47
-14
lines changed

src/shared/Z.EF.Plus.Audit.Shared/Extensions/DbSet`AuditEntry/DbSet`AuditEntry.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ public static IQueryable<AuditEntry> Where<T>(this DbSet<AuditEntry> set, T entr
3939
var property = entry.GetType().GetProperty(keyName);
4040
var value = property.GetValue(entry, null).ToString();
4141

42-
query = query.Where(x => x.Properties.Any(y => y.PropertyName == property.Name && y.NewValueFormatted == value));
42+
query = query.Where(x => x.Properties.Any(y => y.PropertyName == property.Name && (y.NewValueFormatted == value
43+
|| (x.State == AuditEntryState.EntityDeleted && y.OldValueFormatted == value))));
4344
}
4445

4546
query = query.Include(x => x.Properties).OrderBy(x => x.CreatedDate);
@@ -68,7 +69,8 @@ public static IQueryable<AuditEntry> Where<T>(this DbSet<AuditEntry> set, params
6869
var propertyName = keyNames[i];
6970
var value = keyValues[i] != null ? keyValues[i].ToString() : "";
7071

71-
query = query.Where(x => x.Properties.Any(y => y.PropertyName == propertyName && y.NewValueFormatted == value));
72+
query = query.Where(x => x.Properties.Any(y => y.PropertyName == propertyName && (y.NewValueFormatted == value
73+
|| (x.State == AuditEntryState.EntityDeleted && y.OldValueFormatted == value))));
7274
}
7375

7476
query = query.Include(x => x.Properties).OrderBy(x => x.CreatedDate);

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

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Data.Entity;
33
using System.Data.Entity.Core.Common.CommandTrees;
4+
using System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder;
45
using System.Data.Entity.Core.Metadata.Edm;
56
using System.Data.Entity.Infrastructure.Interception;
67
using Z.EntityFramework.Plus.QueryInterceptorFilter;
@@ -60,6 +61,13 @@ public override DbExpression Visit(DbPropertyExpression expression)
6061

6162
baseExpression = ApplyFilter(baseExpression, fullName);
6263
}
64+
else if (QueryFilterManager.AllowPropertyFilter && navProp != null)
65+
{
66+
var targetEntityType = navProp.ToEndMember.GetEntityType();
67+
var fullName = targetEntityType.FullName;
68+
69+
baseExpression = ApplyFilter(baseExpression, fullName);
70+
}
6371

6472
return baseExpression;
6573
}
@@ -120,13 +128,33 @@ public DbExpression ApplyFilter(DbExpression baseExpression, string fullName)
120128

121129
if (expression2 != null)
122130
{
123-
var visitor = new QueryFilterInterceptorDbProjectExpression();
124-
visitor.DbScanExpression = baseExpression;
125-
visitor.ParameterCollection = QueryFilterManager.DbExpressionParameterByHook[expression2];
126-
127-
var filetered = expression2.Accept(visitor);
128-
129-
baseExpression = filetered;
131+
var baseExpressionProperty = baseExpression as DbPropertyExpression;
132+
NavigationProperty navProp = null;
133+
134+
if (baseExpressionProperty != null)
135+
{
136+
navProp = baseExpressionProperty.Property as NavigationProperty;
137+
}
138+
139+
if (QueryFilterManager.AllowPropertyFilter && navProp != null && !baseExpression.ResultType.ToString().Contains("Transient.collection["))
140+
{
141+
// Filter property
142+
expression2 = DbExpressionBuilder.Take(expression2, 1);
143+
expression2 = DbExpressionBuilder.Element(expression2);
144+
145+
baseExpression = expression2;
146+
147+
}
148+
else
149+
{
150+
var visitor = new QueryFilterInterceptorDbProjectExpression();
151+
visitor.DbScanExpression = baseExpression;
152+
visitor.ParameterCollection = QueryFilterManager.DbExpressionParameterByHook[expression2];
153+
154+
var filetered = expression2.Accept(visitor);
155+
156+
baseExpression = filetered;
157+
}
130158
}
131159
}
132160
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ public static void RegisterType(Assembly assembly)
5353
RegisterType(types);
5454
}
5555

56+
/// <summary>Gets or sets a value indicating whether we allow property to be filtering.</summary>
57+
/// <value>True if allow property filtering, false if not.</value>
58+
public static bool AllowPropertyFilter { get; set; }
5659

5760
/// <summary>Gets the database expression by hook.</summary>
5861
/// <value>The database expression by hook.</value>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
228228
{
229229
var parameterExtractingExpressionVisitorConstructor = typeof(ParameterExtractingExpressionVisitor).GetConstructors().First(x => x.GetParameters().Length == 5);
230230

231-
var parameterExtractingExpressionVisitor = (ParameterExtractingExpressionVisitor)parameterExtractingExpressionVisitorConstructor.Invoke(new object[] {evaluatableExpressionFilter, queryContext, logger, false, false} );
231+
var parameterExtractingExpressionVisitor = (ParameterExtractingExpressionVisitor)parameterExtractingExpressionVisitorConstructor.Invoke(new object[] {evaluatableExpressionFilter, queryContext, logger, true, false } );
232232

233233
// CREATE new query from query visitor
234234
newQuery = parameterExtractingExpressionVisitor.ExtractParameters(Query.Expression);

src/shared/Z.EF.Plus._Core.Shared/EF/DbContext/DbContext.MapReader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ internal static IEnumerable<T> MapReader<T>(this DbContext context, DbDataReader
166166
{
167167
var parameterExtractingExpressionVisitorConstructor = typeof(ParameterExtractingExpressionVisitor).GetConstructors().First(x => x.GetParameters().Length == 5);
168168

169-
var parameterExtractingExpressionVisitor = (ParameterExtractingExpressionVisitor)parameterExtractingExpressionVisitorConstructor.Invoke(new object[] {evaluatableExpressionFilter, queryContext, logger, false, false} );
169+
var parameterExtractingExpressionVisitor = (ParameterExtractingExpressionVisitor)parameterExtractingExpressionVisitorConstructor.Invoke(new object[] {evaluatableExpressionFilter, queryContext, logger, true, false} );
170170

171171
// CREATE new query from query visitor
172172
newQuery = parameterExtractingExpressionVisitor.ExtractParameters(query.Expression);

src/shared/Z.EF.Plus._Core.Shared/EFCore/IQueryable`/CreateCommand.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public static IRelationalCommand CreateCommand<T>(this IQueryable<T> source, out
7474

7575
var parameterExtractingExpressionVisitorConstructor = typeof(ParameterExtractingExpressionVisitor).GetConstructors().First(x => x.GetParameters().Length == 5);
7676

77-
var parameterExtractingExpressionVisitor = (ParameterExtractingExpressionVisitor)parameterExtractingExpressionVisitorConstructor.Invoke(new object[] {evaluatableExpressionFilter, queryContext, logger, false, false} );
77+
var parameterExtractingExpressionVisitor = (ParameterExtractingExpressionVisitor)parameterExtractingExpressionVisitorConstructor.Invoke(new object[] {evaluatableExpressionFilter, queryContext, logger, true, false} );
7878

7979
// CREATE new query from query visitor
8080
newQuery = parameterExtractingExpressionVisitor.ExtractParameters(source.Expression);
@@ -169,7 +169,7 @@ public static IRelationalCommand CreateCommand(this IQueryable source, out Relat
169169

170170
var parameterExtractingExpressionVisitorConstructor = typeof(ParameterExtractingExpressionVisitor).GetConstructors().First(x => x.GetParameters().Length == 5);
171171

172-
var parameterExtractingExpressionVisitor = (ParameterExtractingExpressionVisitor)parameterExtractingExpressionVisitorConstructor.Invoke(new object[] {evaluatableExpressionFilter, queryContext, logger, false, false} );
172+
var parameterExtractingExpressionVisitor = (ParameterExtractingExpressionVisitor)parameterExtractingExpressionVisitorConstructor.Invoke(new object[] {evaluatableExpressionFilter, queryContext, logger, true, false} );
173173

174174
// CREATE new query from query visitor
175175
newQuery = parameterExtractingExpressionVisitor.ExtractParameters(source.Expression);

src/shared/Z.EF.Plus._Core.Shared/EFCore/IQueryable`/IQueryable`.GetCommand.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public static IRelationalCommand GetDbCommand<T>(this IQueryable<T> query)
144144
{
145145
var parameterExtractingExpressionVisitorConstructor = typeof(ParameterExtractingExpressionVisitor).GetConstructors().First(x => x.GetParameters().Length == 5);
146146

147-
var parameterExtractingExpressionVisitor = (ParameterExtractingExpressionVisitor)parameterExtractingExpressionVisitorConstructor.Invoke(new object[] {evaluatableExpressionFilter, queryContext, logger, false, false} );
147+
var parameterExtractingExpressionVisitor = (ParameterExtractingExpressionVisitor)parameterExtractingExpressionVisitorConstructor.Invoke(new object[] {evaluatableExpressionFilter, queryContext, logger, true, false} );
148148

149149
// CREATE new query from query visitor
150150
newQuery = parameterExtractingExpressionVisitor.ExtractParameters(query.Expression);

0 commit comments

Comments
 (0)