diff --git a/src/Simpleverse.Repository.Db.Test/SqlServer/DatabaseFixture.cs b/src/Simpleverse.Repository.Db.Test/SqlServer/DatabaseFixture.cs index cdeda84..c97d45e 100644 --- a/src/Simpleverse.Repository.Db.Test/SqlServer/DatabaseFixture.cs +++ b/src/Simpleverse.Repository.Db.Test/SqlServer/DatabaseFixture.cs @@ -42,6 +42,16 @@ [Name] NVARCHAR(MAX) NULL, [From] NVARCHAR(MAX) NULL );"); + connection.Execute( + $@"{DropTable("[IdentityDateOfBirth]")} + CREATE TABLE [IdentityDateOfBirth] + ( + [Id] INT IDENTITY(1,1) NOT NULL PRIMARY KEY, + [Name] NVARCHAR(MAX) NULL, + [From] NVARCHAR(MAX) NULL, + [DateOfBirth] DATETIME NOT NULL + );"); + connection.Execute( $@"{DropTable("ExplicitKey")} CREATE TABLE ExplicitKey( @@ -135,6 +145,7 @@ public void TearDownDb() { connection.Open(); connection.Execute($@"{DropTable("[Identity]")}"); + 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 d7c79ad..f343ba0 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; diff --git a/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityTest.cs b/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityTest.cs index 18918c0..9060f1a 100644 --- a/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityTest.cs +++ b/src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityTest.cs @@ -1,13 +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.Linq; -using System.Threading.Tasks; -using System.Transactions; using Xunit; using Xunit.Abstractions; @@ -185,8 +187,35 @@ public async Task GetAsync_WhenProvidedSqlRepository_ReturnsRecord(int count) } } + [Fact] + public async Task GetAsync_WhenFilterContainsDateOfBirth_FiltersAsDateOnly() + { + { + using (var profiler = Profile()) + using (var connection = _fixture.GetProfiledConnection()) + { + // arange + connection.Open(); + connection.Truncate(); + var dobRecord = TestData.IdentityDateOfBirthWithAllData(1).First(); + connection.Insert(dobRecord); + var entity = new IdentityDateOfBirthEntity(_sqlRepository); + + // act + 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(dobRecord.From, returnedEntity.From); + Assert.Equal(dobRecord.DateOfBirth, returnedEntity.DateOfBirth); + } + } + } + [Theory] - [InlineData(10)] + [InlineData(2)] public async Task ListAsync_WhenProvidedSqlRepository_ReturnsRecords(int count) { using (var profiler = Profile()) @@ -303,4 +332,34 @@ public class IdentityQueryFilter { public virtual string Name { get; set; } } + + public class IdentityDateOfBirthEntity : Entity + { + public IdentityDateOfBirthEntity(DatabaseFixture fixture) + : base(new DbRepository(() => fixture.GetProfiledConnection()), new Table("IDB")) + { + } + + public IdentityDateOfBirthEntity(SqlRepository sqlRepository) : base(sqlRepository, new Table("IDB")) { } + + protected override void Filter(QueryBuilder builder, IdentityDateOfBirth filter) + { + var dateOfBirthProperty = builder.Table.Meta.Properties.SingleOrDefault(x => x.Name == nameof(filter.DateOfBirth)); + if (dateOfBirthProperty != null) + { + builder.Where($"CAST({Source.Column(x => x.DateOfBirth)} AS DATE) = CAST(@DateOfBirth AS DATE)", new { filter.DateOfBirth }); + } + + 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 2727b0d..7906034 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,9 @@ public static IEnumerable IdentityWithoutIdData(int count) => public static IEnumerable IdentityWithIdData(int count) => Generate(x => new Identity() { Id = x, Name = x.ToString() }, count); + 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); @@ -169,6 +173,12 @@ public class Immutable : Identity public int ImmutableValue { get; set; } } + [Table("[IdentityDateOfBirth]")] + public class IdentityDateOfBirth : Identity + { + public virtual DateTime DateOfBirth { 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..c95d9cd 100644 --- a/src/Simpleverse.Repository.Db/Entity/Entity.cs +++ b/src/Simpleverse.Repository.Db/Entity/Entity.cs @@ -583,11 +583,7 @@ protected TFilter GetFilter(Action filterSetup) protected virtual void Filter(QueryBuilder builder, TFilter filter) { - var changeTrack = filter as IChangeTrack; - if (changeTrack == null) - return; - - foreach (var propertyName in changeTrack.Changed) + foreach (var propertyName in GetFilterConditions(filter)) { var property = builder.Table.Meta.Properties.SingleOrDefault(x => x.Name == propertyName); if (property is null) @@ -626,6 +622,9 @@ protected virtual void Filter(QueryBuilder builder, TFilter filter) } } + 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)