zeroframework/Services/DeviceCenter/ZeroFramework.DeviceCenter.Domain/Specifications/Specification.cs
2023-12-05 17:22:48 +08:00

81 lines
3.1 KiB
C#

using System.Linq.Expressions;
using ZeroFramework.DeviceCenter.Domain.Specifications.Builder;
using ZeroFramework.DeviceCenter.Domain.Specifications.Evaluators;
namespace ZeroFramework.DeviceCenter.Domain.Specifications
{
public abstract class Specification<T, TResult> : Specification<T>, ISpecification<T, TResult>
{
protected new virtual ISpecificationBuilder<T, TResult> Query { get; }
protected Specification()
: this(InMemorySpecificationEvaluator.Default)
{
}
protected Specification(IInMemorySpecificationEvaluator inMemorySpecificationEvaluator)
: base(inMemorySpecificationEvaluator)
{
this.Query = new SpecificationBuilder<T, TResult>(this);
}
public new virtual IEnumerable<TResult> Evaluate(IEnumerable<T> entities)
{
return Evaluator.Evaluate(entities, this);
}
public Expression<Func<T, TResult>>? Selector { get; internal set; }
public new Func<IEnumerable<TResult>, IEnumerable<TResult>>? PostProcessingAction { get; internal set; } = null;
}
public abstract class Specification<T> : ISpecification<T>
{
protected IInMemorySpecificationEvaluator Evaluator { get; }
protected virtual ISpecificationBuilder<T> Query { get; }
protected Specification()
: this(InMemorySpecificationEvaluator.Default)
{
}
protected Specification(IInMemorySpecificationEvaluator inMemorySpecificationEvaluator)
{
this.Evaluator = inMemorySpecificationEvaluator;
this.Query = new SpecificationBuilder<T>(this);
}
public virtual IEnumerable<T> Evaluate(IEnumerable<T> entities)
{
return Evaluator.Evaluate(entities, this);
}
public IEnumerable<Expression<Func<T, bool>>> WhereExpressions { get; } = new List<Expression<Func<T, bool>>>();
public IEnumerable<(Expression<Func<T, object>> KeySelector, OrderTypeEnum OrderType)> OrderExpressions { get; } =
new List<(Expression<Func<T, object>> KeySelector, OrderTypeEnum OrderType)>();
public IEnumerable<IncludeExpressionInfo> IncludeExpressions { get; } = new List<IncludeExpressionInfo>();
public IEnumerable<string> IncludeStrings { get; } = new List<string>();
public IEnumerable<(Expression<Func<T, string>> Selector, string SearchTerm, int SearchGroup)> SearchCriterias { get; } =
new List<(Expression<Func<T, string>> Selector, string SearchTerm, int SearchGroup)>();
public int? Take { get; internal set; } = null;
public int? Skip { get; internal set; } = null;
public Func<IEnumerable<T>, IEnumerable<T>>? PostProcessingAction { get; internal set; } = null;
public string? CacheKey { get; internal set; }
public bool CacheEnabled { get; internal set; }
public bool AsNoTracking { get; internal set; } = false;
public bool AsSplitQuery { get; internal set; } = false;
public bool AsNoTrackingWithIdentityResolution { get; internal set; } = false;
}
}