diff --git a/src/Clave.Expressionify/ExpressionifyQueryTranslationPreprocessor.cs b/src/Clave.Expressionify/ExpressionifyQueryTranslationPreprocessor.cs index 0e49977..3ce9658 100644 --- a/src/Clave.Expressionify/ExpressionifyQueryTranslationPreprocessor.cs +++ b/src/Clave.Expressionify/ExpressionifyQueryTranslationPreprocessor.cs @@ -22,12 +22,13 @@ public ExpressionifyQueryTranslationPreprocessor( public override Expression Process(Expression query) { var visitor = new ExpressionifyVisitor(); + query = _innerPreprocessor.Process(query); query = visitor.Visit(query); if (visitor.HasReplacedCalls) query = EvaluateExpression(query); - return _innerPreprocessor.Process(query); + return query; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "EF1001:Internal EF Core API usage.", Justification = "")] @@ -50,7 +51,7 @@ private Expression EvaluateExpression(Expression query) generateContextAccessors: false); return visitor.ExtractParameters(query); - + /* With EF9 something along these lines would have been the ideal solution: ExpressionTreeFuncletizer funcletizer = new( QueryCompilationContext.Model, diff --git a/tests/Clave.Expressionify.Tests/DbContextExtensions/TestDbContext.cs b/tests/Clave.Expressionify.Tests/DbContextExtensions/TestDbContext.cs index b1f6a88..5fc966c 100644 --- a/tests/Clave.Expressionify.Tests/DbContextExtensions/TestDbContext.cs +++ b/tests/Clave.Expressionify.Tests/DbContextExtensions/TestDbContext.cs @@ -8,5 +8,11 @@ public TestDbContext(DbContextOptions options) : base(options) { } public DbSet TestEntities { get; set; } = null!; + public DbSet TestEntities2 { get; set; } = null!; + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity().HasQueryFilter(x => x.IsFoo()); + } } } diff --git a/tests/Clave.Expressionify.Tests/DbContextExtensions/TestEntity.cs b/tests/Clave.Expressionify.Tests/DbContextExtensions/TestEntity.cs index 762c352..990ee39 100644 --- a/tests/Clave.Expressionify.Tests/DbContextExtensions/TestEntity.cs +++ b/tests/Clave.Expressionify.Tests/DbContextExtensions/TestEntity.cs @@ -9,6 +9,12 @@ public class TestEntity public DateTime Created { get; set; } } + public class TestEntity2 + { + public int Id { get; set; } + public string Name { get; set; } = ""; + } + public class TestAddress { public string? City { get; set; } diff --git a/tests/Clave.Expressionify.Tests/DbContextExtensions/TestEntityExtensions.cs b/tests/Clave.Expressionify.Tests/DbContextExtensions/TestEntityExtensions.cs index 44f9d89..7a818a5 100644 --- a/tests/Clave.Expressionify.Tests/DbContextExtensions/TestEntityExtensions.cs +++ b/tests/Clave.Expressionify.Tests/DbContextExtensions/TestEntityExtensions.cs @@ -11,6 +11,12 @@ public static partial class TestEntityExtensions [Expressionify] public static bool IsJohnDoe(this TestEntity testEntity) => testEntity.Name == "John Doe"; + [Expressionify] + public static bool IsFoo(this TestEntity2 testEntity) => testEntity.Name == "Foo"; + + [Expressionify] + public static string GetFoo(this TestEntity2 testEntity) => "Foo " + testEntity.Name; + [Expressionify] public static bool IsSomething(this TestEntity testEntity) => testEntity.Name == Name; diff --git a/tests/Clave.Expressionify.Tests/DbContextExtensions/Tests.cs b/tests/Clave.Expressionify.Tests/DbContextExtensions/Tests.cs index 751ce5a..e02ee2a 100644 --- a/tests/Clave.Expressionify.Tests/DbContextExtensions/Tests.cs +++ b/tests/Clave.Expressionify.Tests/DbContextExtensions/Tests.cs @@ -188,6 +188,18 @@ public void UseExpressionify_EvaluationMode_DefaultsToLimitedCompatibilityButCac debugInfo["Expressionify:EvaluationMode"].ShouldBe(ExpressionEvaluationMode.LimitedCompatibilityButCached.ToString()); } + //[TestCase(ExpressionEvaluationMode.FullCompatibilityButSlow)] + [TestCase(ExpressionEvaluationMode.LimitedCompatibilityButCached)] + public void UseExpressionify_InFilter(ExpressionEvaluationMode mode) + { + using var dbContext = new TestDbContext(GetOptions(o => o.WithEvaluationMode(mode))); + var query = dbContext.TestEntities2.Select(e => e.GetFoo()); + + var sql = query.ToQueryString(); + sql.ShouldStartWith("SELECT 'Foo ' || \"t\".\"Name\""); + sql.ShouldEndWith("WHERE \"t\".\"Name\" = 'Foo'"); + } + private DbContextOptions GetOptions(Action? optionsAction = null, bool useExpressionify = true) { var builder = new DbContextOptionsBuilder().UseSqlite("DataSource=:memory:");