-
Notifications
You must be signed in to change notification settings - Fork 253
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?