Skip to content

Commit b02d386

Browse files
committed
Refactor query filter logic for EF Core compatibility
Refactored entity type filtering to use GetEntityTypes<TEntity> and IsAssignableTo for improved robustness. Updated query filter property access to use EF.Property<T> for better EF Core query translation support. These changes enhance maintainability and align with EF Core best practices.
1 parent ab826e0 commit b02d386

File tree

1 file changed

+13
-17
lines changed

1 file changed

+13
-17
lines changed

src/TinyHelpers.EntityFrameworkCore/Extensions/ModelBuilderExtensions.cs

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,11 @@ public static class ModelBuilderExtensions
1717
/// <param name="expression">The filter expression to apply.</param>
1818
public static void ApplyQueryFilter<TEntity>(this ModelBuilder modelBuilder, Expression<Func<TEntity, bool>> expression)
1919
{
20-
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
20+
foreach (var clrType in modelBuilder.GetEntityTypes<TEntity>())
2121
{
22-
if (typeof(TEntity).IsAssignableFrom(entityType.ClrType))
23-
{
24-
var parameter = Expression.Parameter(entityType.ClrType);
25-
var body = ReplacingExpressionVisitor.Replace(expression.Parameters.Single(), parameter, expression.Body);
26-
modelBuilder.Entity(entityType.ClrType).HasQueryFilter(Expression.Lambda(body, parameter));
27-
}
22+
var parameter = Expression.Parameter(clrType);
23+
var body = ReplacingExpressionVisitor.Replace(expression.Parameters.Single(), parameter, expression.Body);
24+
modelBuilder.Entity(clrType).HasQueryFilter(Expression.Lambda(body, parameter));
2825
}
2926
}
3027

@@ -43,7 +40,8 @@ public static void ApplyQueryFilter<TType>(this ModelBuilder modelBuilder, strin
4340
if (property?.ClrType == typeof(TType))
4441
{
4542
var parameter = Expression.Parameter(entityType.ClrType);
46-
var filter = Expression.Lambda(Expression.Equal(Expression.Property(parameter, propertyName), Expression.Constant(value)), parameter);
43+
var propertyAccess = Expression.Call(typeof(EF), nameof(EF.Property), [typeof(TType)], parameter, Expression.Constant(propertyName));
44+
var filter = Expression.Lambda(Expression.Equal(propertyAccess, Expression.Constant(value, typeof(TType))), parameter);
4745
modelBuilder.Entity(entityType.ClrType).HasQueryFilter(filter);
4846
}
4947
}
@@ -65,14 +63,11 @@ public static void ApplyQueryFilter<TType>(this ModelBuilder modelBuilder, strin
6563
/// </remarks>
6664
public static void ApplyQueryFilter<TEntity>(this ModelBuilder modelBuilder, string filterName, Expression<Func<TEntity, bool>> expression)
6765
{
68-
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
66+
foreach (var clrType in modelBuilder.GetEntityTypes<TEntity>())
6967
{
70-
if (typeof(TEntity).IsAssignableFrom(entityType.ClrType))
71-
{
72-
var parameter = Expression.Parameter(entityType.ClrType);
73-
var body = ReplacingExpressionVisitor.Replace(expression.Parameters.Single(), parameter, expression.Body);
74-
modelBuilder.Entity(entityType.ClrType).HasQueryFilter(filterName, Expression.Lambda(body, parameter));
75-
}
68+
var parameter = Expression.Parameter(clrType);
69+
var body = ReplacingExpressionVisitor.Replace(expression.Parameters.Single(), parameter, expression.Body);
70+
modelBuilder.Entity(clrType).HasQueryFilter(filterName, Expression.Lambda(body, parameter));
7671
}
7772
}
7873

@@ -98,7 +93,8 @@ public static void ApplyQueryFilter<TType>(this ModelBuilder modelBuilder, strin
9893
if (property?.ClrType == typeof(TType))
9994
{
10095
var parameter = Expression.Parameter(entityType.ClrType);
101-
var filter = Expression.Lambda(Expression.Equal(Expression.Property(parameter, propertyName), Expression.Constant(value)), parameter);
96+
var propertyAccess = Expression.Call(typeof(EF), nameof(EF.Property), [typeof(TType)], parameter, Expression.Constant(propertyName));
97+
var filter = Expression.Lambda(Expression.Equal(propertyAccess, Expression.Constant(value, typeof(TType))), parameter);
10298
modelBuilder.Entity(entityType.ClrType).HasQueryFilter(filterName, filter);
10399
}
104100
}
@@ -123,7 +119,7 @@ public static IEnumerable<Type> GetEntityTypes<TType>(this ModelBuilder modelBui
123119
public static IEnumerable<Type> GetEntityTypes(this ModelBuilder modelBuilder, Type baseType)
124120
{
125121
var entityTypes = modelBuilder.Model.GetEntityTypes()
126-
.Where(t => baseType.IsAssignableFrom(t.ClrType))
122+
.Where(t => t.ClrType.IsAssignableTo(baseType))
127123
.ToList();
128124

129125
return entityTypes.Select(t => t.ClrType);

0 commit comments

Comments
 (0)