-
Notifications
You must be signed in to change notification settings - Fork 255
Description
I've noticed that ISpecificationBuilder<T>
has AsNoTracking<T>
method.
Situation one:
In my abstract repository class, it has a method:
protected virtual IQueryable<TEntity> ApplySpecification(ISpecification<TEntity> specification
bool evaluateCriteriaOnly = false)
{
return SpecificationEvaluator.GetQuery(EntitySet.AsNoTracking(), specification, evaluateCriteriaOnly);
}
EntitySet
is an instance of DbSet<TEntity>
. EntitySet.AsNoTracking()
makes that the query results are not tracked by default.
Now I want some Specification to make sure its query results are being tracked. How do I do in my Specification class?
Since the ISpecificationBuilder<T>.AsNoTracking<T>
is supported, I think we should support ISpecificationBuilder<T>.AsTracking<T>
just like IQueryable<T>.AsTracking<T>
do.
Situation two:
Let the specifications control tracking.
I have a pagination specification class:
public abstract class PaginationSpecification<T> : Specification<T>, ISearchSpecification<T> where T : class
{
public sealed override ISpecificationBuilder<T> Query => null!;
protected PaginationSpecification(IPagination pagination)
: this(pagination, InMemorySpecificationEvaluator.Default, SpecificationValidator.Default)
{
}
protected PaginationSpecification(IPagination pagination,
IInMemorySpecificationEvaluator inMemorySpecificationEvaluator)
: this(pagination, inMemorySpecificationEvaluator, SpecificationValidator.Default)
{
}
protected PaginationSpecification(IPagination pagination, ISpecificationValidator specificationValidator)
: this(pagination, InMemorySpecificationEvaluator.Default, specificationValidator)
{
}
protected PaginationSpecification(IPagination pagination,
IInMemorySpecificationEvaluator inMemorySpecificationEvaluator,
ISpecificationValidator specificationValidator, bool isTracking = false) : base(inMemorySpecificationEvaluator, specificationValidator)
{
if (pagination is IOrderRequestModel orderRequestModel)
{
OrderedSpecificationAdapt.Instance.ApplyOrder(Query, orderRequestModel);
}
Query.AsNoTracking().Skip(pagination.PageSize * (pagination.PageIndex - 1))
.Take(pagination.PageSize);
}
public bool IsPredicateLess() => !WhereExpressions.Any();
}
Query.AsNoTracking()
makes class PaginationSpecification<T>
is an untracked specification.
Now, I create a TrackingPaginationSpecification<T>
class that inherit from PaginationSpecification<T>
, so I can use TrackingPaginationSpecification<T>
to query pagination results and edit them paged.
public abstract class TrackingPaginationSpecification<T> : PaginationSpecification<T>
{
protected PaginationSpecification(IPagination pagination)
{
// make the query is tracked
// this will cause compile error, AsTracking() method does not exists.
Query.AsTracking();
}
}
What can we do in this situation?