From 2ffa229e564f827a11f2b7f0afe53f4ffb120177 Mon Sep 17 00:00:00 2001 From: Matija Hudin Date: Wed, 18 Feb 2026 16:56:38 +0100 Subject: [PATCH 1/2] added action to filter --- .../SqlServer/DatabaseFixture.cs | 13 ++++ .../SqlServer/Entity/EntityProxyTest.cs | 10 +-- .../SqlServer/Entity/EntityTest.cs | 68 +++++++++++++++++-- .../TestData.cs | 28 ++++++++ .../Entity/Entity.cs | 22 +++--- 5 files changed, 122 insertions(+), 19 deletions(-) diff --git a/src/Simpleverse.Repository.Db.Test/SqlServer/DatabaseFixture.cs b/src/Simpleverse.Repository.Db.Test/SqlServer/DatabaseFixture.cs index cdeda84..9d2e6b8 100644 --- a/src/Simpleverse.Repository.Db.Test/SqlServer/DatabaseFixture.cs +++ b/src/Simpleverse.Repository.Db.Test/SqlServer/DatabaseFixture.cs @@ -42,6 +42,18 @@ [Name] NVARCHAR(MAX) NULL, [From] NVARCHAR(MAX) NULL );"); + connection.Execute( + $@"{DropTable("[IdentityExpandedFrom]")} + CREATE TABLE [IdentityExpandedFrom] + ( + [Id] INT IDENTITY(1,1) NOT NULL PRIMARY KEY, + [Name] NVARCHAR(MAX) NULL, + [From] NVARCHAR(MAX) NULL, + [City] NVARCHAR(MAX) NULL, + [Street] NVARCHAR(MAX) NULL, + [HouseNo] NVARCHAR(MAX) NULL + );"); + connection.Execute( $@"{DropTable("ExplicitKey")} CREATE TABLE ExplicitKey( @@ -135,6 +147,7 @@ public void TearDownDb() { connection.Open(); connection.Execute($@"{DropTable("[Identity]")}"); + connection.Execute($@"{DropTable("[IdentityExpandedFrom]")}"); connection.Execute($@"{DropTable("[ExplicitKey]")}"); connection.Execute($@"{DropTable("[IdentityAndExplict]")}"); connection.Execute($@"{DropTable("[Computed]")}"); diff --git a/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityProxyTest.cs b/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityProxyTest.cs index d7c79ad..fb9b4dd 100644 --- a/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityProxyTest.cs +++ b/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityProxyTest.cs @@ -1,5 +1,7 @@ using Dapper.Contrib.Extensions; using Simpleverse.Repository.Db.Entity; +using System; +using System.Collections.Generic; using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; @@ -275,9 +277,9 @@ public EntityNonVirtual(DbRepository repository) { } - protected override void Filter(QueryBuilder builder, EntityNonVirtualModel filter) + protected override void Filter(QueryBuilder builder, EntityNonVirtualModel filter, Action> action = null) { - base.Filter(builder, filter); + base.Filter(builder, filter, action); builder.Where(x => x.Id, filter.Id); builder.Where(x => x.Name, filter.Name); builder.Where(x => x.Active, filter.Active); @@ -320,9 +322,9 @@ public EntityCustom(DbRepository repository) { } - protected override void Filter(QueryBuilder builder, EntityModelExtended filter) + protected override void Filter(QueryBuilder builder, EntityModelExtended filter, Action> action = null) { - base.Filter(builder, filter); + base.Filter(builder, filter, action); IfChanged(filter, x => x.DummyValue, () => builder.Where(x => x.DummyValue, filter.DummyValue)); } } diff --git a/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityTest.cs b/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityTest.cs index 18918c0..d87e992 100644 --- a/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityTest.cs +++ b/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityTest.cs @@ -5,6 +5,7 @@ using Simpleverse.Repository.Db.SqlServer; using StackExchange.Profiling.Data; using System; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Transactions; @@ -186,7 +187,36 @@ public async Task GetAsync_WhenProvidedSqlRepository_ReturnsRecord(int count) } [Theory] - [InlineData(10)] + [InlineData("City|Street|Number")] + [InlineData("Adress")] + public async Task GetAsync_WhenFilterInCorrectFormat_UsesFilterAction(string from) + { + { + using (var profiler = Profile()) + using (var connection = _fixture.GetProfiledConnection()) + { + // arange + connection.Open(); + connection.Truncate(); + var fromRecord = TestData.IdentityExpandedFromWithAllData(from); + connection.Insert(fromRecord); + var entity = new IdentityExpandedFromEntity(_sqlRepository); + + // act + await entity.AddAsync(fromRecord); + var returnedEntity = await entity.GetAsync(filter => filter.From = from); + // assert + Assert.NotNull(returnedEntity); + Assert.Equal(fromRecord.From, returnedEntity.From); + Assert.Equal(fromRecord.City, returnedEntity.City); + Assert.Equal(fromRecord.Street, returnedEntity.Street); + Assert.Equal(fromRecord.HouseNo, returnedEntity.HouseNo); + } + } + } + + [Theory] + [InlineData(2)] public async Task ListAsync_WhenProvidedSqlRepository_ReturnsRecords(int count) { using (var profiler = Profile()) @@ -277,7 +307,7 @@ public IdentityEntity(DatabaseFixture fixture) public IdentityEntity(SqlRepository sqlRepository) : base(sqlRepository, new Table("I")) { } - protected override void SelectQuery(QueryBuilder builder, IdentityQueryFilter filter, DbQueryOptions options) + protected override void SelectQuery(QueryBuilder builder, IdentityQueryFilter filter, DbQueryOptions options, Action> action = null) { var explicitKey = new Table("EK"); @@ -289,13 +319,13 @@ protected override void SelectQuery(QueryBuilder builder, IdentityQuer ek => ek.Id ); - base.SelectQuery(builder, filter, options); + base.SelectQuery(builder, filter, options, action); } - protected override void Filter(QueryBuilder builder, IdentityQueryFilter filter) + protected override void Filter(QueryBuilder builder, IdentityQueryFilter filter, Action> action = null) { builder.Where(x => x.Name, filter.Name); - base.Filter(builder, filter); + base.Filter(builder, filter, action); } } @@ -303,4 +333,32 @@ public class IdentityQueryFilter { public virtual string Name { get; set; } } + + public class IdentityExpandedFromEntity : Entity + { + public IdentityExpandedFromEntity(DatabaseFixture fixture) + : base(new DbRepository(() => fixture.GetProfiledConnection()), new Table("IEF")) + { + } + + public IdentityExpandedFromEntity(SqlRepository sqlRepository) : base(sqlRepository, new Table("IEF")) { } + + protected override void Filter(QueryBuilder builder, IdentityExpandedFrom filter, Action> action = null) + { + if (filter.From.Count(c => c == '|') == 2) + { + string[] split = filter.From.Split('|'); + filter.City = split[0]; + filter.Street = split[1]; + filter.HouseNo = split[2]; + + Action> filterAction = (changedProperties) => + { + var filteredProperties = changedProperties.Where(p => p != "From"); + action?.Invoke(filteredProperties); + }; + } + else base.Filter(builder, filter, action); + } + } } diff --git a/src/Simpleverse.Repository.Db.Test/TestData.cs b/src/Simpleverse.Repository.Db.Test/TestData.cs index 2727b0d..19df538 100644 --- a/src/Simpleverse.Repository.Db.Test/TestData.cs +++ b/src/Simpleverse.Repository.Db.Test/TestData.cs @@ -2,6 +2,7 @@ using Simpleverse.Repository.Db.Meta; using System; using System.Collections.Generic; +using System.Linq; namespace Simpleverse.Repository.Db.Test { @@ -28,6 +29,25 @@ public static IEnumerable IdentityWithoutIdData(int count) => public static IEnumerable IdentityWithIdData(int count) => Generate(x => new Identity() { Id = x, Name = x.ToString() }, count); + public static IdentityExpandedFrom IdentityExpandedFromWithAllData(string from) => + Generate(x => + { + string[] splitFrom = null; + if (from.Count(c => c == '|') == 2) + splitFrom = from.Split('|'); + + return new IdentityExpandedFrom() + { + Id = x, + Name = x.ToString(), + From = splitFrom == null ? from : null, + City = splitFrom != null ? splitFrom[0] : null, + Street = splitFrom != null ? splitFrom[1] : null, + HouseNo = splitFrom != null ? splitFrom[2] : null + }; + }, 1) + .First(); + public static IEnumerable ExplicitKeyData(int count) => Generate(x => new ExplicitKey() { Id = x, Name = x.ToString() }, count); @@ -169,6 +189,14 @@ public class Immutable : Identity public int ImmutableValue { get; set; } } + [Table("[IdentityExpandedFrom]")] + public class IdentityExpandedFrom : Identity + { + public virtual string City { get; set; } + public virtual string Street { get; set; } + public virtual string HouseNo { get; set; } + } + public enum @Enum { Odd = 1, diff --git a/src/Simpleverse.Repository.Db/Entity/Entity.cs b/src/Simpleverse.Repository.Db/Entity/Entity.cs index 03d4312..0b7ca41 100644 --- a/src/Simpleverse.Repository.Db/Entity/Entity.cs +++ b/src/Simpleverse.Repository.Db/Entity/Entity.cs @@ -131,10 +131,10 @@ public virtual Task> ListAsync(IDbConnection connection, TFilt return connection.QueryAsync(query, tran: transaction); } - protected virtual void SelectQuery(QueryBuilder builder, TFilter filter, TOptions options) + protected virtual void SelectQuery(QueryBuilder builder, TFilter filter, TOptions options, Action> action = null) { builder.SelectAll(); - Query(builder, filter); + Query(builder, filter, action); } protected virtual SqlBuilder.Template SelectTemplate(QueryBuilder builder, TOptions options) @@ -144,10 +144,10 @@ protected virtual SqlBuilder.Template SelectTemplate(QueryBuilder builde #endregion - protected void Query(QueryBuilder builder, TFilter filter) + protected void Query(QueryBuilder builder, TFilter filter, Action> action = null) { Join(builder, filter); - Filter(builder, filter); + Filter(builder, filter, action); } #endregion @@ -261,10 +261,10 @@ public virtual Task UpdateAsync(IDbConnection connection, Action u return connection.ExecuteAsync(query, tran: transaction); } - protected virtual void UpdateQuery(QueryBuilder builder, TUpdate update, TFilter filter, TOptions options) + protected virtual void UpdateQuery(QueryBuilder builder, TUpdate update, TFilter filter, TOptions options, Action> action = null) { Set(builder, update); - Query(builder, filter); + Query(builder, filter, action); } protected virtual SqlBuilder.Template UpdateTemplate(QueryBuilder builder, TUpdate update, TFilter filter, TOptions options) @@ -412,8 +412,8 @@ public virtual Task DeleteAsync( return connection.ExecuteAsync(query, tran: transaction); } - protected virtual void DeleteQuery(QueryBuilder builder, TFilter filter, TOptions options) - => Query(builder, filter); + protected virtual void DeleteQuery(QueryBuilder builder, TFilter filter, TOptions options, Action> action = null) + => Query(builder, filter, action); protected virtual SqlBuilder.Template DeleteTemplate(QueryBuilder builder, TOptions options) { @@ -581,13 +581,15 @@ protected TFilter GetFilter(Action filterSetup) ); } - protected virtual void Filter(QueryBuilder builder, TFilter filter) + protected virtual void Filter(QueryBuilder builder, TFilter filter, Action> action = null) { var changeTrack = filter as IChangeTrack; if (changeTrack == null) return; - foreach (var propertyName in changeTrack.Changed) + var changed = changeTrack.Changed; + action?.Invoke(changed); + foreach (var propertyName in changed) { var property = builder.Table.Meta.Properties.SingleOrDefault(x => x.Name == propertyName); if (property is null) From 9cf3254f95c00ad81e007999d5fd9b45cca339a2 Mon Sep 17 00:00:00 2001 From: Matija Hudin Date: Thu, 26 Feb 2026 19:01:33 +0100 Subject: [PATCH 2/2] fixes and refactors --- .../SqlServer/DatabaseFixture.cs | 10 +-- .../SqlServer/Entity/EntityProxyTest.cs | 8 +- .../SqlServer/Entity/EntityTest.cs | 83 ++++++++++--------- .../TestData.cs | 28 ++----- .../Entity/Entity.cs | 29 +++---- 5 files changed, 68 insertions(+), 90 deletions(-) diff --git a/src/Simpleverse.Repository.Db.Test/SqlServer/DatabaseFixture.cs b/src/Simpleverse.Repository.Db.Test/SqlServer/DatabaseFixture.cs index 9d2e6b8..c97d45e 100644 --- a/src/Simpleverse.Repository.Db.Test/SqlServer/DatabaseFixture.cs +++ b/src/Simpleverse.Repository.Db.Test/SqlServer/DatabaseFixture.cs @@ -43,15 +43,13 @@ [From] NVARCHAR(MAX) NULL );"); connection.Execute( - $@"{DropTable("[IdentityExpandedFrom]")} - CREATE TABLE [IdentityExpandedFrom] + $@"{DropTable("[IdentityDateOfBirth]")} + CREATE TABLE [IdentityDateOfBirth] ( [Id] INT IDENTITY(1,1) NOT NULL PRIMARY KEY, [Name] NVARCHAR(MAX) NULL, [From] NVARCHAR(MAX) NULL, - [City] NVARCHAR(MAX) NULL, - [Street] NVARCHAR(MAX) NULL, - [HouseNo] NVARCHAR(MAX) NULL + [DateOfBirth] DATETIME NOT NULL );"); connection.Execute( @@ -147,7 +145,7 @@ public void TearDownDb() { connection.Open(); connection.Execute($@"{DropTable("[Identity]")}"); - connection.Execute($@"{DropTable("[IdentityExpandedFrom]")}"); + connection.Execute($@"{DropTable("[IdentityDateOfBirth]")}"); connection.Execute($@"{DropTable("[ExplicitKey]")}"); connection.Execute($@"{DropTable("[IdentityAndExplict]")}"); connection.Execute($@"{DropTable("[Computed]")}"); diff --git a/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityProxyTest.cs b/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityProxyTest.cs index fb9b4dd..f343ba0 100644 --- a/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityProxyTest.cs +++ b/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityProxyTest.cs @@ -277,9 +277,9 @@ public EntityNonVirtual(DbRepository repository) { } - protected override void Filter(QueryBuilder builder, EntityNonVirtualModel filter, Action> action = null) + protected override void Filter(QueryBuilder builder, EntityNonVirtualModel filter) { - base.Filter(builder, filter, action); + base.Filter(builder, filter); builder.Where(x => x.Id, filter.Id); builder.Where(x => x.Name, filter.Name); builder.Where(x => x.Active, filter.Active); @@ -322,9 +322,9 @@ public EntityCustom(DbRepository repository) { } - protected override void Filter(QueryBuilder builder, EntityModelExtended filter, Action> action = null) + protected override void Filter(QueryBuilder builder, EntityModelExtended filter) { - base.Filter(builder, filter, action); + base.Filter(builder, filter); IfChanged(filter, x => x.DummyValue, () => builder.Where(x => x.DummyValue, filter.DummyValue)); } } diff --git a/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityTest.cs b/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityTest.cs index d87e992..9060f1a 100644 --- a/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityTest.cs +++ b/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityTest.cs @@ -1,14 +1,15 @@ -using Dapper.Contrib.Extensions; +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using System.Threading.Tasks; +using System.Transactions; +using Dapper.Contrib.Extensions; using Simpleverse.Repository.Db.Entity; using Simpleverse.Repository.Db.Extensions; using Simpleverse.Repository.Db.Extensions.Dapper; using Simpleverse.Repository.Db.SqlServer; using StackExchange.Profiling.Data; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using System.Transactions; using Xunit; using Xunit.Abstractions; @@ -186,10 +187,8 @@ public async Task GetAsync_WhenProvidedSqlRepository_ReturnsRecord(int count) } } - [Theory] - [InlineData("City|Street|Number")] - [InlineData("Adress")] - public async Task GetAsync_WhenFilterInCorrectFormat_UsesFilterAction(string from) + [Fact] + public async Task GetAsync_WhenFilterContainsDateOfBirth_FiltersAsDateOnly() { { using (var profiler = Profile()) @@ -197,20 +196,20 @@ public async Task GetAsync_WhenFilterInCorrectFormat_UsesFilterAction(string fro { // arange connection.Open(); - connection.Truncate(); - var fromRecord = TestData.IdentityExpandedFromWithAllData(from); - connection.Insert(fromRecord); - var entity = new IdentityExpandedFromEntity(_sqlRepository); + connection.Truncate(); + var dobRecord = TestData.IdentityDateOfBirthWithAllData(1).First(); + connection.Insert(dobRecord); + var entity = new IdentityDateOfBirthEntity(_sqlRepository); // act - await entity.AddAsync(fromRecord); - var returnedEntity = await entity.GetAsync(filter => filter.From = from); + await entity.AddAsync(dobRecord); + var filterDay = DateOnly.FromDateTime(dobRecord.DateOfBirth); + var returnedEntity = await entity.GetAsync(filter => filter.DateOfBirth = filterDay.ToDateTime(TimeOnly.MinValue)); + // assert Assert.NotNull(returnedEntity); - Assert.Equal(fromRecord.From, returnedEntity.From); - Assert.Equal(fromRecord.City, returnedEntity.City); - Assert.Equal(fromRecord.Street, returnedEntity.Street); - Assert.Equal(fromRecord.HouseNo, returnedEntity.HouseNo); + Assert.Equal(dobRecord.From, returnedEntity.From); + Assert.Equal(dobRecord.DateOfBirth, returnedEntity.DateOfBirth); } } } @@ -307,7 +306,7 @@ public IdentityEntity(DatabaseFixture fixture) public IdentityEntity(SqlRepository sqlRepository) : base(sqlRepository, new Table("I")) { } - protected override void SelectQuery(QueryBuilder builder, IdentityQueryFilter filter, DbQueryOptions options, Action> action = null) + protected override void SelectQuery(QueryBuilder builder, IdentityQueryFilter filter, DbQueryOptions options) { var explicitKey = new Table("EK"); @@ -319,13 +318,13 @@ protected override void SelectQuery(QueryBuilder builder, IdentityQuer ek => ek.Id ); - base.SelectQuery(builder, filter, options, action); + base.SelectQuery(builder, filter, options); } - protected override void Filter(QueryBuilder builder, IdentityQueryFilter filter, Action> action = null) + protected override void Filter(QueryBuilder builder, IdentityQueryFilter filter) { builder.Where(x => x.Name, filter.Name); - base.Filter(builder, filter, action); + base.Filter(builder, filter); } } @@ -334,31 +333,33 @@ public class IdentityQueryFilter public virtual string Name { get; set; } } - public class IdentityExpandedFromEntity : Entity + public class IdentityDateOfBirthEntity : Entity { - public IdentityExpandedFromEntity(DatabaseFixture fixture) - : base(new DbRepository(() => fixture.GetProfiledConnection()), new Table("IEF")) + public IdentityDateOfBirthEntity(DatabaseFixture fixture) + : base(new DbRepository(() => fixture.GetProfiledConnection()), new Table("IDB")) { } - public IdentityExpandedFromEntity(SqlRepository sqlRepository) : base(sqlRepository, new Table("IEF")) { } + public IdentityDateOfBirthEntity(SqlRepository sqlRepository) : base(sqlRepository, new Table("IDB")) { } - protected override void Filter(QueryBuilder builder, IdentityExpandedFrom filter, Action> action = null) + protected override void Filter(QueryBuilder builder, IdentityDateOfBirth filter) { - if (filter.From.Count(c => c == '|') == 2) + var dateOfBirthProperty = builder.Table.Meta.Properties.SingleOrDefault(x => x.Name == nameof(filter.DateOfBirth)); + if (dateOfBirthProperty != null) { - string[] split = filter.From.Split('|'); - filter.City = split[0]; - filter.Street = split[1]; - filter.HouseNo = split[2]; - - Action> filterAction = (changedProperties) => - { - var filteredProperties = changedProperties.Where(p => p != "From"); - action?.Invoke(filteredProperties); - }; + builder.Where($"CAST({Source.Column(x => x.DateOfBirth)} AS DATE) = CAST(@DateOfBirth AS DATE)", new { filter.DateOfBirth }); } - else base.Filter(builder, filter, action); + + base.Filter(builder, filter); + } + + protected override IEnumerable GetFilterConditions(IdentityDateOfBirth filter) + { + var changed = base.GetFilterConditions(filter).ToList(); + + changed.Remove(nameof(IdentityDateOfBirth.DateOfBirth)); + + return changed; } } } diff --git a/src/Simpleverse.Repository.Db.Test/TestData.cs b/src/Simpleverse.Repository.Db.Test/TestData.cs index 19df538..7906034 100644 --- a/src/Simpleverse.Repository.Db.Test/TestData.cs +++ b/src/Simpleverse.Repository.Db.Test/TestData.cs @@ -29,24 +29,8 @@ public static IEnumerable IdentityWithoutIdData(int count) => public static IEnumerable IdentityWithIdData(int count) => Generate(x => new Identity() { Id = x, Name = x.ToString() }, count); - public static IdentityExpandedFrom IdentityExpandedFromWithAllData(string from) => - Generate(x => - { - string[] splitFrom = null; - if (from.Count(c => c == '|') == 2) - splitFrom = from.Split('|'); - - return new IdentityExpandedFrom() - { - Id = x, - Name = x.ToString(), - From = splitFrom == null ? from : null, - City = splitFrom != null ? splitFrom[0] : null, - Street = splitFrom != null ? splitFrom[1] : null, - HouseNo = splitFrom != null ? splitFrom[2] : null - }; - }, 1) - .First(); + public static IEnumerable IdentityDateOfBirthWithAllData(int count) => + Generate(x => new IdentityDateOfBirth() { Id = x, Name = x.ToString(), DateOfBirth = DateTime.UtcNow }, count); public static IEnumerable ExplicitKeyData(int count) => Generate(x => new ExplicitKey() { Id = x, Name = x.ToString() }, count); @@ -189,12 +173,10 @@ public class Immutable : Identity public int ImmutableValue { get; set; } } - [Table("[IdentityExpandedFrom]")] - public class IdentityExpandedFrom : Identity + [Table("[IdentityDateOfBirth]")] + public class IdentityDateOfBirth : Identity { - public virtual string City { get; set; } - public virtual string Street { get; set; } - public virtual string HouseNo { get; set; } + public virtual DateTime DateOfBirth { get; set; } } public enum @Enum diff --git a/src/Simpleverse.Repository.Db/Entity/Entity.cs b/src/Simpleverse.Repository.Db/Entity/Entity.cs index 0b7ca41..c95d9cd 100644 --- a/src/Simpleverse.Repository.Db/Entity/Entity.cs +++ b/src/Simpleverse.Repository.Db/Entity/Entity.cs @@ -131,10 +131,10 @@ public virtual Task> ListAsync(IDbConnection connection, TFilt return connection.QueryAsync(query, tran: transaction); } - protected virtual void SelectQuery(QueryBuilder builder, TFilter filter, TOptions options, Action> action = null) + protected virtual void SelectQuery(QueryBuilder builder, TFilter filter, TOptions options) { builder.SelectAll(); - Query(builder, filter, action); + Query(builder, filter); } protected virtual SqlBuilder.Template SelectTemplate(QueryBuilder builder, TOptions options) @@ -144,10 +144,10 @@ protected virtual SqlBuilder.Template SelectTemplate(QueryBuilder builde #endregion - protected void Query(QueryBuilder builder, TFilter filter, Action> action = null) + protected void Query(QueryBuilder builder, TFilter filter) { Join(builder, filter); - Filter(builder, filter, action); + Filter(builder, filter); } #endregion @@ -261,10 +261,10 @@ public virtual Task UpdateAsync(IDbConnection connection, Action u return connection.ExecuteAsync(query, tran: transaction); } - protected virtual void UpdateQuery(QueryBuilder builder, TUpdate update, TFilter filter, TOptions options, Action> action = null) + protected virtual void UpdateQuery(QueryBuilder builder, TUpdate update, TFilter filter, TOptions options) { Set(builder, update); - Query(builder, filter, action); + Query(builder, filter); } protected virtual SqlBuilder.Template UpdateTemplate(QueryBuilder builder, TUpdate update, TFilter filter, TOptions options) @@ -412,8 +412,8 @@ public virtual Task DeleteAsync( return connection.ExecuteAsync(query, tran: transaction); } - protected virtual void DeleteQuery(QueryBuilder builder, TFilter filter, TOptions options, Action> action = null) - => Query(builder, filter, action); + protected virtual void DeleteQuery(QueryBuilder builder, TFilter filter, TOptions options) + => Query(builder, filter); protected virtual SqlBuilder.Template DeleteTemplate(QueryBuilder builder, TOptions options) { @@ -581,15 +581,9 @@ protected TFilter GetFilter(Action filterSetup) ); } - protected virtual void Filter(QueryBuilder builder, TFilter filter, Action> action = null) + protected virtual void Filter(QueryBuilder builder, TFilter filter) { - var changeTrack = filter as IChangeTrack; - if (changeTrack == null) - return; - - var changed = changeTrack.Changed; - action?.Invoke(changed); - foreach (var propertyName in changed) + foreach (var propertyName in GetFilterConditions(filter)) { var property = builder.Table.Meta.Properties.SingleOrDefault(x => x.Name == propertyName); if (property is null) @@ -628,6 +622,9 @@ protected virtual void Filter(QueryBuilder builder, TFilter filter, Acti } } + protected virtual IEnumerable GetFilterConditions(TFilter filter) + => (filter as IChangeTrack)?.Changed ?? Array.Empty(); + protected virtual void Join(QueryBuilder builder, TFilter filter) { } protected void IfChanged(T filter, Expression> expression, Action action)