* Added possibility to chain includes. * Removed interface. * Removed the need for generating GUIDs as ids and added tests.
64 lines
2.4 KiB
C#
64 lines
2.4 KiB
C#
using Microsoft.eShopWeb.ApplicationCore.Interfaces;
|
|
using System;
|
|
using System.Linq.Expressions;
|
|
using System.Collections.Generic;
|
|
using Microsoft.eShopWeb.ApplicationCore.Helpers.Query;
|
|
|
|
namespace Microsoft.eShopWeb.ApplicationCore.Specifications
|
|
{
|
|
public abstract class BaseSpecification<T> : ISpecification<T>
|
|
{
|
|
protected BaseSpecification(Expression<Func<T, bool>> criteria)
|
|
{
|
|
Criteria = criteria;
|
|
}
|
|
public Expression<Func<T, bool>> Criteria { get; }
|
|
public List<Expression<Func<T, object>>> Includes { get; } = new List<Expression<Func<T, object>>>();
|
|
public List<string> IncludeStrings { get; } = new List<string>();
|
|
public Expression<Func<T, object>> OrderBy { get; private set; }
|
|
public Expression<Func<T, object>> OrderByDescending { get; private set; }
|
|
public Expression<Func<T, object>> GroupBy { get; private set; }
|
|
|
|
public int Take { get; private set; }
|
|
public int Skip { get; private set; }
|
|
public bool IsPagingEnabled { get; private set; } = false;
|
|
|
|
protected virtual void AddInclude(Expression<Func<T, object>> includeExpression)
|
|
{
|
|
Includes.Add(includeExpression);
|
|
}
|
|
|
|
protected virtual void AddIncludes<TProperty>(Func<IncludeAggregator<T>, IIncludeQuery<T, TProperty>> includeGenerator)
|
|
{
|
|
var includeQuery = includeGenerator(new IncludeAggregator<T>());
|
|
IncludeStrings.AddRange(includeQuery.Paths);
|
|
}
|
|
|
|
protected virtual void AddInclude(string includeString)
|
|
{
|
|
IncludeStrings.Add(includeString);
|
|
}
|
|
protected virtual void ApplyPaging(int skip, int take)
|
|
{
|
|
Skip = skip;
|
|
Take = take;
|
|
IsPagingEnabled = true;
|
|
}
|
|
protected virtual void ApplyOrderBy(Expression<Func<T, object>> orderByExpression)
|
|
{
|
|
OrderBy = orderByExpression;
|
|
}
|
|
protected virtual void ApplyOrderByDescending(Expression<Func<T, object>> orderByDescendingExpression)
|
|
{
|
|
OrderByDescending = orderByDescendingExpression;
|
|
}
|
|
|
|
//Not used anywhere at the moment, but someone requested an example of setting this up.
|
|
protected virtual void ApplyGroupBy(Expression<Func<T, object>> groupByExpression)
|
|
{
|
|
GroupBy = groupByExpression;
|
|
}
|
|
|
|
}
|
|
}
|