From 576246746aef332fef9208a7c5d1cae5a234bf96 Mon Sep 17 00:00:00 2001 From: furkandeveloper Date: Thu, 30 Jun 2022 17:29:54 +0300 Subject: [PATCH 01/10] =?UTF-8?q?=E2=9E=95=20Add=20Ardalis.Specification.E?= =?UTF-8?q?ntityFrameworkCore=20dependency?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EasyRepository.EFCore.Generic.csproj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/EasyRepository.EFCore.Generic/EasyRepository.EFCore.Generic.csproj b/src/EasyRepository.EFCore.Generic/EasyRepository.EFCore.Generic.csproj index 5e707bb..142b08b 100644 --- a/src/EasyRepository.EFCore.Generic/EasyRepository.EFCore.Generic.csproj +++ b/src/EasyRepository.EFCore.Generic/EasyRepository.EFCore.Generic.csproj @@ -14,5 +14,8 @@ + + + From ebddf575810690c85ebdf217baf43a2e8ab38f3a Mon Sep 17 00:00:00 2001 From: furkandeveloper Date: Sat, 2 Jul 2022 23:18:27 +0300 Subject: [PATCH 02/10] =?UTF-8?q?=F0=9F=8E=89=20TADA=20!!=20Begin=20Ardali?= =?UTF-8?q?s.Specification=20project?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Class1.cs | 5 +++++ .../EasyRepository.EFCore.Ardalis.Specification.csproj | 9 +++++++++ 2 files changed, 14 insertions(+) create mode 100644 src/EasyRepository.EFCore.Ardalis.Specification/Class1.cs create mode 100644 src/EasyRepository.EFCore.Ardalis.Specification/EasyRepository.EFCore.Ardalis.Specification.csproj diff --git a/src/EasyRepository.EFCore.Ardalis.Specification/Class1.cs b/src/EasyRepository.EFCore.Ardalis.Specification/Class1.cs new file mode 100644 index 0000000..5a3b339 --- /dev/null +++ b/src/EasyRepository.EFCore.Ardalis.Specification/Class1.cs @@ -0,0 +1,5 @@ +namespace EasyRepository.EFCore.Ardalis.Specification; + +public class Class1 +{ +} \ No newline at end of file diff --git a/src/EasyRepository.EFCore.Ardalis.Specification/EasyRepository.EFCore.Ardalis.Specification.csproj b/src/EasyRepository.EFCore.Ardalis.Specification/EasyRepository.EFCore.Ardalis.Specification.csproj new file mode 100644 index 0000000..eb2460e --- /dev/null +++ b/src/EasyRepository.EFCore.Ardalis.Specification/EasyRepository.EFCore.Ardalis.Specification.csproj @@ -0,0 +1,9 @@ + + + + net6.0 + enable + enable + + + From 6c0b0d038e95d1731a9d7585630a2cb67af29c9d Mon Sep 17 00:00:00 2001 From: furkandeveloper Date: Sat, 2 Jul 2022 23:38:06 +0300 Subject: [PATCH 03/10] =?UTF-8?q?=F0=9F=94=A5=20Delete=20default=20class?= =?UTF-8?q?=20from=20Ardalis.Specification=20project?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/EasyRepository.EFCore.Ardalis.Specification/Class1.cs | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 src/EasyRepository.EFCore.Ardalis.Specification/Class1.cs diff --git a/src/EasyRepository.EFCore.Ardalis.Specification/Class1.cs b/src/EasyRepository.EFCore.Ardalis.Specification/Class1.cs deleted file mode 100644 index 5a3b339..0000000 --- a/src/EasyRepository.EFCore.Ardalis.Specification/Class1.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace EasyRepository.EFCore.Ardalis.Specification; - -public class Class1 -{ -} \ No newline at end of file From 2c6858e2e40beb071aed05460cacb30a2519c105 Mon Sep 17 00:00:00 2001 From: furkandeveloper Date: Sat, 2 Jul 2022 23:44:23 +0300 Subject: [PATCH 04/10] =?UTF-8?q?=F0=9F=94=A8=20Add=20SpecificationBuilder?= =?UTF-8?q?.cs=20to=20the=20Ardalis.Specification=20project?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SpecificationBuilder.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/EasyRepository.EFCore.Ardalis.Specification/SpecificationBuilder.cs diff --git a/src/EasyRepository.EFCore.Ardalis.Specification/SpecificationBuilder.cs b/src/EasyRepository.EFCore.Ardalis.Specification/SpecificationBuilder.cs new file mode 100644 index 0000000..c5fcee4 --- /dev/null +++ b/src/EasyRepository.EFCore.Ardalis.Specification/SpecificationBuilder.cs @@ -0,0 +1,13 @@ +using System.Linq; +using Ardalis.Specification; +using Ardalis.Specification.EntityFrameworkCore; + +namespace EasyRepository.EFCore.Ardalis.Specification; + +public static class SpecificationBuilder +{ + public static IQueryable Build(IQueryable entity, ISpecification specification) where TEntity : class, new() + { + return SpecificationEvaluator.Default.GetQuery(entity, specification); + } +} \ No newline at end of file From 71c0095180f3e37b91b1f11030c3ae37f0a03cdc Mon Sep 17 00:00:00 2001 From: furkandeveloper Date: Sat, 2 Jul 2022 23:50:21 +0300 Subject: [PATCH 05/10] =?UTF-8?q?=E2=99=BB=EF=B8=8FRefactor=20csproj=20fil?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EasyRepository.EFCore.sln | 15 ++++++++ ...sitory.EFCore.Ardalis.Specification.csproj | 15 +++++--- .../folders.png | Bin 0 -> 50185 bytes .../EasyRepository.EFCore.Generic.csproj | 32 ++++++++---------- 4 files changed, 40 insertions(+), 22 deletions(-) create mode 100644 src/EasyRepository.EFCore.Ardalis.Specification/folders.png diff --git a/EasyRepository.EFCore.sln b/EasyRepository.EFCore.sln index cb4d768..e84a0ef 100644 --- a/EasyRepository.EFCore.sln +++ b/EasyRepository.EFCore.sln @@ -20,6 +20,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyRepository.Sample", "sa EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EasyRepository.EFCore.Abstractions", "src\EasyRepository.EFCore.Abstractions\EasyRepository.EFCore.Abstractions.csproj", "{F3046DA7-D0EA-4A6E-A633-969B13E4EB5B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EasyRepository.EFCore.Ardalis.Specification", "src\EasyRepository.EFCore.Ardalis.Specification\EasyRepository.EFCore.Ardalis.Specification.csproj", "{2DBA6C0F-2C4B-4516-A7C6-AF322B37834B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -66,6 +68,18 @@ Global {F3046DA7-D0EA-4A6E-A633-969B13E4EB5B}.Release|x64.Build.0 = Release|Any CPU {F3046DA7-D0EA-4A6E-A633-969B13E4EB5B}.Release|x86.ActiveCfg = Release|Any CPU {F3046DA7-D0EA-4A6E-A633-969B13E4EB5B}.Release|x86.Build.0 = Release|Any CPU + {2DBA6C0F-2C4B-4516-A7C6-AF322B37834B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2DBA6C0F-2C4B-4516-A7C6-AF322B37834B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2DBA6C0F-2C4B-4516-A7C6-AF322B37834B}.Debug|x64.ActiveCfg = Debug|Any CPU + {2DBA6C0F-2C4B-4516-A7C6-AF322B37834B}.Debug|x64.Build.0 = Debug|Any CPU + {2DBA6C0F-2C4B-4516-A7C6-AF322B37834B}.Debug|x86.ActiveCfg = Debug|Any CPU + {2DBA6C0F-2C4B-4516-A7C6-AF322B37834B}.Debug|x86.Build.0 = Debug|Any CPU + {2DBA6C0F-2C4B-4516-A7C6-AF322B37834B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2DBA6C0F-2C4B-4516-A7C6-AF322B37834B}.Release|Any CPU.Build.0 = Release|Any CPU + {2DBA6C0F-2C4B-4516-A7C6-AF322B37834B}.Release|x64.ActiveCfg = Release|Any CPU + {2DBA6C0F-2C4B-4516-A7C6-AF322B37834B}.Release|x64.Build.0 = Release|Any CPU + {2DBA6C0F-2C4B-4516-A7C6-AF322B37834B}.Release|x86.ActiveCfg = Release|Any CPU + {2DBA6C0F-2C4B-4516-A7C6-AF322B37834B}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -74,6 +88,7 @@ Global {730B0EE2-7048-4F0E-9DA0-7F0DDED22707} = {6ECD69C4-213C-400A-8EFE-DB1B5E33DC29} {84940E1B-6A42-4485-82DC-4EE105B637AA} = {1670C5F3-D8A7-42DB-A377-5405F1B4BCE6} {F3046DA7-D0EA-4A6E-A633-969B13E4EB5B} = {6ECD69C4-213C-400A-8EFE-DB1B5E33DC29} + {2DBA6C0F-2C4B-4516-A7C6-AF322B37834B} = {6ECD69C4-213C-400A-8EFE-DB1B5E33DC29} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {82B432B5-EED3-42E9-AFEC-D899479E4CC3} diff --git a/src/EasyRepository.EFCore.Ardalis.Specification/EasyRepository.EFCore.Ardalis.Specification.csproj b/src/EasyRepository.EFCore.Ardalis.Specification/EasyRepository.EFCore.Ardalis.Specification.csproj index eb2460e..50803e1 100644 --- a/src/EasyRepository.EFCore.Ardalis.Specification/EasyRepository.EFCore.Ardalis.Specification.csproj +++ b/src/EasyRepository.EFCore.Ardalis.Specification/EasyRepository.EFCore.Ardalis.Specification.csproj @@ -1,9 +1,16 @@ + - net6.0 - enable - enable + folders.png + - + + + True + + + + + diff --git a/src/EasyRepository.EFCore.Ardalis.Specification/folders.png b/src/EasyRepository.EFCore.Ardalis.Specification/folders.png new file mode 100644 index 0000000000000000000000000000000000000000..982008942a6686c5071dd98b40a62500f275f0b6 GIT binary patch literal 50185 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 - - - folders.png - - - - - - - - True - - - - - - - + + + folders.png + + + + + + + + True + + + From e41596306fe9907e34d79357b3ec61671b604ed5 Mon Sep 17 00:00:00 2001 From: furkandeveloper Date: Sat, 2 Jul 2022 23:55:16 +0300 Subject: [PATCH 06/10] =?UTF-8?q?=E2=99=BB=EF=B8=8FRename=20SpecificationB?= =?UTF-8?q?uilder.cs=20to=20SpecificationConverter.cs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SpecificationBuilder.cs | 13 -------- .../SpecificationConverter.cs | 31 +++++++++++++++++++ 2 files changed, 31 insertions(+), 13 deletions(-) delete mode 100644 src/EasyRepository.EFCore.Ardalis.Specification/SpecificationBuilder.cs create mode 100644 src/EasyRepository.EFCore.Ardalis.Specification/SpecificationConverter.cs diff --git a/src/EasyRepository.EFCore.Ardalis.Specification/SpecificationBuilder.cs b/src/EasyRepository.EFCore.Ardalis.Specification/SpecificationBuilder.cs deleted file mode 100644 index c5fcee4..0000000 --- a/src/EasyRepository.EFCore.Ardalis.Specification/SpecificationBuilder.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Linq; -using Ardalis.Specification; -using Ardalis.Specification.EntityFrameworkCore; - -namespace EasyRepository.EFCore.Ardalis.Specification; - -public static class SpecificationBuilder -{ - public static IQueryable Build(IQueryable entity, ISpecification specification) where TEntity : class, new() - { - return SpecificationEvaluator.Default.GetQuery(entity, specification); - } -} \ No newline at end of file diff --git a/src/EasyRepository.EFCore.Ardalis.Specification/SpecificationConverter.cs b/src/EasyRepository.EFCore.Ardalis.Specification/SpecificationConverter.cs new file mode 100644 index 0000000..ccb0c37 --- /dev/null +++ b/src/EasyRepository.EFCore.Ardalis.Specification/SpecificationConverter.cs @@ -0,0 +1,31 @@ +using System.Linq; +using Ardalis.Specification; +using Ardalis.Specification.EntityFrameworkCore; + +namespace EasyRepository.EFCore.Ardalis.Specification; + +/// +/// Specification Builder +/// +public static class SpecificationConverter +{ + /// + /// This method convert specification object to queryable object. + /// + /// + /// Entity + /// + /// + /// Specification object + /// + /// + /// Entity + /// + /// + /// + /// + public static IQueryable Convert(IQueryable entity, ISpecification specification) where TEntity : class, new() + { + return SpecificationEvaluator.Default.GetQuery(entity, specification); + } +} \ No newline at end of file From 0184fec37d81e3421c11c592b4452395b7ee157f Mon Sep 17 00:00:00 2001 From: furkandeveloper Date: Sat, 2 Jul 2022 23:55:50 +0300 Subject: [PATCH 07/10] =?UTF-8?q?=F0=9F=94=A8=20Add=20Ardalis.Specificatio?= =?UTF-8?q?n=20sample=20code=20block?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/AuthorController.cs | 13 ++++++++++++- .../EasyRepository.Sample.csproj | 1 + .../Specs/AuthorByNameSpec.cs | 17 +++++++++++++++++ ...pository.EFCore.Ardalis.Specification.csproj | 6 +++--- 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 sample/EasyRepository.Sample/Specs/AuthorByNameSpec.cs diff --git a/sample/EasyRepository.Sample/Controllers/AuthorController.cs b/sample/EasyRepository.Sample/Controllers/AuthorController.cs index 2d78a4a..7ea7fa0 100644 --- a/sample/EasyRepository.Sample/Controllers/AuthorController.cs +++ b/sample/EasyRepository.Sample/Controllers/AuthorController.cs @@ -8,7 +8,9 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using EasyRepository.EFCore.Ardalis.Specification; using EasyRepository.EFCore.Generic; +using EasyRepository.Sample.Specs; namespace EasyRepository.Sample.Controllers { @@ -23,6 +25,15 @@ public AuthorController(IRepository repository, IUnitOfWork unitOfWork) _unitOfWork = unitOfWork; } + [HttpGet(Name = "FilterAuthor")] + public async Task FilterAuthorAsync([FromQuery]string name) + { + var queryable = _unitOfWork.Repository.GetQueryable(); + var spec = new AuthorByNameSpec(name); + var data = SpecificationConverter.Convert(queryable, spec); + return Ok(data.ToList()); + } + [HttpPost] public async Task AddAuthorAsync([FromBody] AuthorRequestDto dto) { @@ -36,7 +47,7 @@ public async Task AddAuthorAsync([FromBody] AuthorRequestDto dto) { Title = "Book 123", TotalPage = 124, - AuthorId = Guid.NewGuid() + AuthorId = entity.Id }); await _unitOfWork.Repository.CompleteAsync(); diff --git a/sample/EasyRepository.Sample/EasyRepository.Sample.csproj b/sample/EasyRepository.Sample/EasyRepository.Sample.csproj index 5efd121..6de7de2 100644 --- a/sample/EasyRepository.Sample/EasyRepository.Sample.csproj +++ b/sample/EasyRepository.Sample/EasyRepository.Sample.csproj @@ -18,6 +18,7 @@ + diff --git a/sample/EasyRepository.Sample/Specs/AuthorByNameSpec.cs b/sample/EasyRepository.Sample/Specs/AuthorByNameSpec.cs new file mode 100644 index 0000000..3d0658d --- /dev/null +++ b/sample/EasyRepository.Sample/Specs/AuthorByNameSpec.cs @@ -0,0 +1,17 @@ +using Ardalis.Specification; +using EasyRepository.Sample.Entities; + +namespace EasyRepository.Sample.Specs +{ + /// + /// Author By Name specification + /// + public sealed class AuthorByNameSpec : Specification + { + /// + public AuthorByNameSpec(string name) + { + Query.Where(c => c.Name == name); + } + } +} \ No newline at end of file diff --git a/src/EasyRepository.EFCore.Ardalis.Specification/EasyRepository.EFCore.Ardalis.Specification.csproj b/src/EasyRepository.EFCore.Ardalis.Specification/EasyRepository.EFCore.Ardalis.Specification.csproj index 50803e1..906c746 100644 --- a/src/EasyRepository.EFCore.Ardalis.Specification/EasyRepository.EFCore.Ardalis.Specification.csproj +++ b/src/EasyRepository.EFCore.Ardalis.Specification/EasyRepository.EFCore.Ardalis.Specification.csproj @@ -1,9 +1,9 @@ - + folders.png - + @@ -11,6 +11,6 @@ - + From e2ccfc136e9ef14990b2fbd11654f68b0a12f2ea Mon Sep 17 00:00:00 2001 From: furkandeveloper Date: Sun, 3 Jul 2022 14:38:12 +0300 Subject: [PATCH 08/10] =?UTF-8?q?=F0=9F=94=A8=20Add=20order=20by=20example?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Specs/AuthorOrderByNameSpec.cs | 36 +++++++++++++++++++ ...sitory.EFCore.Ardalis.Specification.csproj | 9 ++--- 2 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 sample/EasyRepository.Sample/Specs/AuthorOrderByNameSpec.cs diff --git a/sample/EasyRepository.Sample/Specs/AuthorOrderByNameSpec.cs b/sample/EasyRepository.Sample/Specs/AuthorOrderByNameSpec.cs new file mode 100644 index 0000000..607e3d3 --- /dev/null +++ b/sample/EasyRepository.Sample/Specs/AuthorOrderByNameSpec.cs @@ -0,0 +1,36 @@ +using Ardalis.Specification; +using EasyRepository.Sample.Entities; + +namespace EasyRepository.Sample.Specs +{ + /// + /// Order by author name specification + /// + public sealed class AuthorOrderByNameSpec : Specification + { + /// + public AuthorOrderByNameSpec(string name) + { + Query.ApplyBaseRules().ApplyByName(name).OrderBy(o => o.Name); + } + } + + public static class AuthorSpecification + { + public static ISpecificationBuilder ApplyBaseRules( + this ISpecificationBuilder specificationBuilder) + { + specificationBuilder.Include(x => x.Books); + + return specificationBuilder; + } + + public static ISpecificationBuilder ApplyByName( + this ISpecificationBuilder specificationBuilder, string name) + { + specificationBuilder.Where(a => a.Name.Contains(name)); + + return specificationBuilder; + } + } +} \ No newline at end of file diff --git a/src/EasyRepository.EFCore.Ardalis.Specification/EasyRepository.EFCore.Ardalis.Specification.csproj b/src/EasyRepository.EFCore.Ardalis.Specification/EasyRepository.EFCore.Ardalis.Specification.csproj index 906c746..7e76974 100644 --- a/src/EasyRepository.EFCore.Ardalis.Specification/EasyRepository.EFCore.Ardalis.Specification.csproj +++ b/src/EasyRepository.EFCore.Ardalis.Specification/EasyRepository.EFCore.Ardalis.Specification.csproj @@ -1,16 +1,17 @@ - + folders.png - + - + True + - + From d54556284a09aa9895ad9ce1cdaa6555fdfc9a2a Mon Sep 17 00:00:00 2001 From: furkandeveloper Date: Sun, 3 Jul 2022 14:38:25 +0300 Subject: [PATCH 09/10] =?UTF-8?q?=F0=9F=94=A8=20Add=20json=20ignore=20prop?= =?UTF-8?q?erty?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sample/EasyRepository.Sample/Entities/Author.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sample/EasyRepository.Sample/Entities/Author.cs b/sample/EasyRepository.Sample/Entities/Author.cs index 304a095..943e5da 100644 --- a/sample/EasyRepository.Sample/Entities/Author.cs +++ b/sample/EasyRepository.Sample/Entities/Author.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text.Json.Serialization; using System.Threading.Tasks; namespace EasyRepository.Sample.Entities @@ -12,6 +13,7 @@ public class Author : EasyBaseEntity public string Surname { get; set; } + [JsonIgnore] public virtual ICollection Books { get; set; } } } From 78483f07b2e55c5b3563ceb25192eb24478f8997 Mon Sep 17 00:00:00 2001 From: furkandeveloper Date: Sun, 3 Jul 2022 14:38:40 +0300 Subject: [PATCH 10/10] =?UTF-8?q?=F0=9F=94=A8=20Change=20specification?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sample/EasyRepository.Sample/Controllers/AuthorController.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sample/EasyRepository.Sample/Controllers/AuthorController.cs b/sample/EasyRepository.Sample/Controllers/AuthorController.cs index 7ea7fa0..993a221 100644 --- a/sample/EasyRepository.Sample/Controllers/AuthorController.cs +++ b/sample/EasyRepository.Sample/Controllers/AuthorController.cs @@ -29,7 +29,8 @@ public AuthorController(IRepository repository, IUnitOfWork unitOfWork) public async Task FilterAuthorAsync([FromQuery]string name) { var queryable = _unitOfWork.Repository.GetQueryable(); - var spec = new AuthorByNameSpec(name); + //var spec = new AuthorByNameSpec(name); + var spec = new AuthorOrderByNameSpec(name); var data = SpecificationConverter.Convert(queryable, spec); return Ok(data.ToList()); }