From 990536743f7f956f37cf1a1672347bdab0c2d547 Mon Sep 17 00:00:00 2001 From: Fati Iseni Date: Wed, 12 Jan 2022 18:37:07 +0100 Subject: [PATCH] Move the selector checks to the evaluators. --- .../Evaluators/SpecificationEvaluator.cs | 8 +++++++- .../RepositoryBaseOfT.cs | 3 --- .../Evaluators/SpecificationEvaluator.cs | 8 +++++++- .../RepositoryBaseOfT.cs | 3 --- .../RepositoryOfT_GetBySpec.cs | 2 +- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Specification.EntityFramework6/src/Ardalis.Specification.EntityFramework6/Evaluators/SpecificationEvaluator.cs b/Specification.EntityFramework6/src/Ardalis.Specification.EntityFramework6/Evaluators/SpecificationEvaluator.cs index 0215f825..dad9f2aa 100644 --- a/Specification.EntityFramework6/src/Ardalis.Specification.EntityFramework6/Evaluators/SpecificationEvaluator.cs +++ b/Specification.EntityFramework6/src/Ardalis.Specification.EntityFramework6/Evaluators/SpecificationEvaluator.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; namespace Ardalis.Specification.EntityFramework6 @@ -31,6 +32,9 @@ public SpecificationEvaluator(IEnumerable evaluators) /// public virtual IQueryable GetQuery(IQueryable query, ISpecification specification) where T : class { + if (specification is null) throw new ArgumentNullException("Specification is required"); + if (specification.Selector is null) throw new SelectorNotFoundException(); + query = GetQuery(query, (ISpecification)specification); return query.Select(specification.Selector); @@ -39,6 +43,8 @@ public virtual IQueryable GetQuery(IQueryable query, ISp /// public virtual IQueryable GetQuery(IQueryable query, ISpecification specification, bool evaluateCriteriaOnly = false) where T : class { + if (specification is null) throw new ArgumentNullException("Specification is required"); + var evaluators = evaluateCriteriaOnly ? this.evaluators.Where(x => x.IsCriteriaEvaluator) : this.evaluators; foreach (var evaluator in evaluators) diff --git a/Specification.EntityFramework6/src/Ardalis.Specification.EntityFramework6/RepositoryBaseOfT.cs b/Specification.EntityFramework6/src/Ardalis.Specification.EntityFramework6/RepositoryBaseOfT.cs index 11ab0fe2..337ed8b1 100644 --- a/Specification.EntityFramework6/src/Ardalis.Specification.EntityFramework6/RepositoryBaseOfT.cs +++ b/Specification.EntityFramework6/src/Ardalis.Specification.EntityFramework6/RepositoryBaseOfT.cs @@ -143,9 +143,6 @@ protected virtual IQueryable ApplySpecification(ISpecification specificati /// The filtered projected entities as an . protected virtual IQueryable ApplySpecification(ISpecification specification) { - if (specification is null) throw new ArgumentNullException("Specification is required"); - if (specification.Selector is null) throw new SelectorNotFoundException(); - return specificationEvaluator.GetQuery(dbContext.Set().AsQueryable(), specification); } } diff --git a/Specification.EntityFrameworkCore/src/Ardalis.Specification.EntityFrameworkCore/Evaluators/SpecificationEvaluator.cs b/Specification.EntityFrameworkCore/src/Ardalis.Specification.EntityFrameworkCore/Evaluators/SpecificationEvaluator.cs index 102f383c..4a5237f5 100644 --- a/Specification.EntityFrameworkCore/src/Ardalis.Specification.EntityFrameworkCore/Evaluators/SpecificationEvaluator.cs +++ b/Specification.EntityFrameworkCore/src/Ardalis.Specification.EntityFrameworkCore/Evaluators/SpecificationEvaluator.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; namespace Ardalis.Specification.EntityFrameworkCore @@ -45,6 +46,9 @@ public SpecificationEvaluator(IEnumerable evaluators) /// public virtual IQueryable GetQuery(IQueryable query, ISpecification specification) where T : class { + if (specification is null) throw new ArgumentNullException("Specification is required"); + if (specification.Selector is null) throw new SelectorNotFoundException(); + query = GetQuery(query, (ISpecification)specification); return query.Select(specification.Selector); @@ -53,6 +57,8 @@ public virtual IQueryable GetQuery(IQueryable query, ISp /// public virtual IQueryable GetQuery(IQueryable query, ISpecification specification, bool evaluateCriteriaOnly = false) where T : class { + if (specification is null) throw new ArgumentNullException("Specification is required"); + var evaluators = evaluateCriteriaOnly ? this.evaluators.Where(x => x.IsCriteriaEvaluator) : this.evaluators; foreach (var evaluator in evaluators) diff --git a/Specification.EntityFrameworkCore/src/Ardalis.Specification.EntityFrameworkCore/RepositoryBaseOfT.cs b/Specification.EntityFrameworkCore/src/Ardalis.Specification.EntityFrameworkCore/RepositoryBaseOfT.cs index f36da477..68c1632d 100644 --- a/Specification.EntityFrameworkCore/src/Ardalis.Specification.EntityFrameworkCore/RepositoryBaseOfT.cs +++ b/Specification.EntityFrameworkCore/src/Ardalis.Specification.EntityFrameworkCore/RepositoryBaseOfT.cs @@ -143,9 +143,6 @@ protected virtual IQueryable ApplySpecification(ISpecification specificati /// The filtered projected entities as an . protected virtual IQueryable ApplySpecification(ISpecification specification) { - if (specification is null) throw new ArgumentNullException("Specification is required"); - if (specification.Selector is null) throw new SelectorNotFoundException(); - return specificationEvaluator.GetQuery(dbContext.Set().AsQueryable(), specification); } } diff --git a/Specification.EntityFrameworkCore/tests/Ardalis.Specification.EntityFrameworkCore.IntegrationTests/RepositoryOfT_GetBySpec.cs b/Specification.EntityFrameworkCore/tests/Ardalis.Specification.EntityFrameworkCore.IntegrationTests/RepositoryOfT_GetBySpec.cs index d1443458..1c248602 100644 --- a/Specification.EntityFrameworkCore/tests/Ardalis.Specification.EntityFrameworkCore.IntegrationTests/RepositoryOfT_GetBySpec.cs +++ b/Specification.EntityFrameworkCore/tests/Ardalis.Specification.EntityFrameworkCore.IntegrationTests/RepositoryOfT_GetBySpec.cs @@ -98,7 +98,7 @@ public virtual async Task ReturnsUntrackedCompany_GivenCompanyByIdAsUntrackedSpe result.Should().NotBeNull(); result?.Name.Should().Be(CompanySeed.VALID_COMPANY_NAME); - dbContext.Entry(result).State.Should().Be(Microsoft.EntityFrameworkCore.EntityState.Detached); + dbContext.Entry(result!).State.Should().Be(Microsoft.EntityFrameworkCore.EntityState.Detached); } [Fact]