Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 10 additions & 7 deletions samples/Ardalis.Sample.App2/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,20 +103,23 @@ public class CustomerByIdProjectionSpec : Specification<Customer, CustomerDto>
{
public CustomerByIdProjectionSpec(int id)
{
Query.Where(x => x.Id == id);
Query.Select(x => new CustomerDto(x.Id, x.Name, x.Age,
x.Addresses
.Select(a => new AddressDto(a.Id, a.Street, a.CustomerId))
.ToList()));
Query
.Where(x => x.Id == id)
.Select(x => new CustomerDto(
x.Id,
x.Name,
x.Age,
x.Addresses.Select(a => new AddressDto(a.Id, a.Street, a.CustomerId)).ToList()));
}
}

public class CustomerNameSpec : Specification<Customer, string>
{
public CustomerNameSpec(int id)
{
Query.Where(x => x.Id == id);
Query.Select(x => x.Name);
Query
.Where(x => x.Id == id)
.Select(x => x.Name);
}
}

Expand Down
29 changes: 10 additions & 19 deletions src/Ardalis.Specification/Builders/Builder_Cache.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@ public static ICacheSpecificationBuilder<T, TResult> EnableCache<T, TResult>(
this ISpecificationBuilder<T, TResult> builder,
string specificationName,
params object[] args) where T : class
=> EnableCache(builder, specificationName, true, args);
{
EnableCache((ISpecificationBuilder<T>)builder, specificationName, true, args);
return (SpecificationBuilder<T, TResult>)builder;
}

/// <summary>
/// Set's the cache key for the specification.
Expand All @@ -35,17 +38,7 @@ public static ICacheSpecificationBuilder<T, TResult> EnableCache<T, TResult>(
bool condition,
params object[] args) where T : class
{
if (condition)
{
if (string.IsNullOrEmpty(specificationName))
{
throw new ArgumentException($"Required input {specificationName} was null or empty.", specificationName);
}

builder.Specification.CacheKey = $"{specificationName}-{string.Join("-", args)}";
}

Specification<T, TResult>.IsChainDiscarded = !condition;
EnableCache((ISpecificationBuilder<T>)builder, specificationName, condition, args);
return (SpecificationBuilder<T, TResult>)builder;
}

Expand Down Expand Up @@ -106,7 +99,10 @@ public static ICacheSpecificationBuilder<T> EnableCache<T>(
public static ICacheSpecificationBuilder<T, TResult> WithCacheKey<T, TResult>(
this ISpecificationBuilder<T, TResult> builder,
string cacheKey) where T : class
=> WithCacheKey(builder, cacheKey, true);
{
WithCacheKey((ISpecificationBuilder<T>)builder, cacheKey, true);
return (SpecificationBuilder<T, TResult>)builder;
}

/// <summary>
/// Sets the cache key for the specification.
Expand All @@ -123,12 +119,7 @@ public static ICacheSpecificationBuilder<T, TResult> WithCacheKey<T, TResult>(
string cacheKey,
bool condition) where T : class
{
if (condition)
{
builder.Specification.CacheKey = cacheKey;
}

Specification<T, TResult>.IsChainDiscarded = !condition;
WithCacheKey((ISpecificationBuilder<T>)builder, cacheKey, condition);
return (SpecificationBuilder<T, TResult>)builder;
}

Expand Down
72 changes: 30 additions & 42 deletions src/Ardalis.Specification/Builders/Builder_Flags.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@ public static partial class SpecificationBuilderExtensions
/// <returns>The updated specification builder.</returns>
public static ISpecificationBuilder<T, TResult> IgnoreQueryFilters<T, TResult>(
this ISpecificationBuilder<T, TResult> builder) where T : class
=> IgnoreQueryFilters(builder, true);
{
IgnoreQueryFilters((ISpecificationBuilder<T>)builder, true);
return builder;
}

/// <summary>
/// Configures the specification to ignore query filters if the condition is true.
Expand All @@ -25,11 +28,7 @@ public static ISpecificationBuilder<T, TResult> IgnoreQueryFilters<T, TResult>(
this ISpecificationBuilder<T, TResult> builder,
bool condition) where T : class
{
if (condition)
{
builder.Specification.IgnoreQueryFilters = true;
}

IgnoreQueryFilters((ISpecificationBuilder<T>)builder, condition);
return builder;
}

Expand Down Expand Up @@ -71,7 +70,10 @@ public static ISpecificationBuilder<T> IgnoreQueryFilters<T>(
/// <returns>The updated specification builder.</returns>
public static ISpecificationBuilder<T, TResult> IgnoreAutoIncludes<T, TResult>(
this ISpecificationBuilder<T, TResult> builder) where T : class
=> IgnoreAutoIncludes(builder, true);
{
IgnoreAutoIncludes((ISpecificationBuilder<T>)builder, true);
return builder;
}

/// <summary>
/// Configures the specification to ignore auto includes if the condition is true.
Expand All @@ -85,11 +87,7 @@ public static ISpecificationBuilder<T, TResult> IgnoreAutoIncludes<T, TResult>(
this ISpecificationBuilder<T, TResult> builder,
bool condition) where T : class
{
if (condition)
{
builder.Specification.IgnoreAutoIncludes = true;
}

IgnoreAutoIncludes((ISpecificationBuilder<T>)builder, condition);
return builder;
}

Expand Down Expand Up @@ -131,7 +129,10 @@ public static ISpecificationBuilder<T> IgnoreAutoIncludes<T>(
/// <returns>The updated specification builder.</returns>
public static ISpecificationBuilder<T, TResult> AsSplitQuery<T, TResult>(
this ISpecificationBuilder<T, TResult> builder) where T : class
=> AsSplitQuery(builder, true);
{
AsSplitQuery((ISpecificationBuilder<T>)builder, true);
return builder;
}

/// <summary>
/// Configures the specification to use split queries if the condition is true.
Expand All @@ -145,11 +146,7 @@ public static ISpecificationBuilder<T, TResult> AsSplitQuery<T, TResult>(
this ISpecificationBuilder<T, TResult> builder,
bool condition) where T : class
{
if (condition)
{
builder.Specification.AsSplitQuery = true;
}

AsSplitQuery((ISpecificationBuilder<T>)builder, condition);
return builder;
}

Expand Down Expand Up @@ -192,7 +189,10 @@ public static ISpecificationBuilder<T> AsSplitQuery<T>(
/// <returns>The updated specification builder.</returns>
public static ISpecificationBuilder<T, TResult> AsNoTracking<T, TResult>(
this ISpecificationBuilder<T, TResult> builder) where T : class
=> AsNoTracking(builder, true);
{
AsNoTracking((ISpecificationBuilder<T>)builder, true);
return builder;
}

/// <summary>
/// Configures the specification to apply NoTracking behavior if the condition is true.
Expand All @@ -207,13 +207,7 @@ public static ISpecificationBuilder<T, TResult> AsNoTracking<T, TResult>(
this ISpecificationBuilder<T, TResult> builder,
bool condition) where T : class
{
if (condition)
{
builder.Specification.AsTracking = false;
builder.Specification.AsNoTrackingWithIdentityResolution = false;
builder.Specification.AsNoTracking = true;
}

AsNoTracking((ISpecificationBuilder<T>)builder, condition);
return builder;
}

Expand Down Expand Up @@ -260,7 +254,10 @@ public static ISpecificationBuilder<T> AsNoTracking<T>(
/// <returns>The updated specification builder.</returns>
public static ISpecificationBuilder<T, TResult> AsNoTrackingWithIdentityResolution<T, TResult>(
this ISpecificationBuilder<T, TResult> builder) where T : class
=> AsNoTrackingWithIdentityResolution(builder, true);
{
AsNoTrackingWithIdentityResolution((ISpecificationBuilder<T>)builder, true);
return builder;
}

/// <summary>
/// Configures the specification to apply AsNoTrackingWithIdentityResolution behavior if the condition is true.
Expand All @@ -275,13 +272,7 @@ public static ISpecificationBuilder<T, TResult> AsNoTrackingWithIdentityResoluti
this ISpecificationBuilder<T, TResult> builder,
bool condition) where T : class
{
if (condition)
{
builder.Specification.AsTracking = false;
builder.Specification.AsNoTracking = false;
builder.Specification.AsNoTrackingWithIdentityResolution = true;
}

AsNoTrackingWithIdentityResolution((ISpecificationBuilder<T>)builder, condition);
return builder;
}

Expand Down Expand Up @@ -328,7 +319,10 @@ public static ISpecificationBuilder<T> AsNoTrackingWithIdentityResolution<T>(
/// <returns>The updated specification builder.</returns>
public static ISpecificationBuilder<T, TResult> AsTracking<T, TResult>(
this ISpecificationBuilder<T, TResult> builder) where T : class
=> AsTracking(builder, true);
{
AsTracking((ISpecificationBuilder<T>)builder, true);
return builder;
}

/// <summary>
/// Configures the specification to apply AsTracking behavior if the condition is true.
Expand All @@ -343,13 +337,7 @@ public static ISpecificationBuilder<T, TResult> AsTracking<T, TResult>(
this ISpecificationBuilder<T, TResult> builder,
bool condition) where T : class
{
if (condition)
{
builder.Specification.AsNoTracking = false;
builder.Specification.AsNoTrackingWithIdentityResolution = false;
builder.Specification.AsTracking = true;
}

AsTracking((ISpecificationBuilder<T>)builder, condition);
return builder;
}

Expand Down
10 changes: 5 additions & 5 deletions src/Ardalis.Specification/Builders/Builder_Include.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ public static IIncludableSpecificationBuilder<T, TResult, TProperty> Include<T,
builder.Specification.Add(expr);
}

Specification<T, TResult>.IsChainDiscarded = !condition;
Specification<T>.IsChainDiscarded = !condition;
var includeBuilder = new IncludableSpecificationBuilder<T, TResult, TProperty>(builder.Specification);
return includeBuilder;
}
Expand Down Expand Up @@ -181,14 +181,14 @@ public static IIncludableSpecificationBuilder<TEntity, TResult, TProperty> ThenI
bool condition)
where TEntity : class
{
if (condition && !Specification<TEntity, TResult>.IsChainDiscarded)
if (condition && !Specification<TEntity>.IsChainDiscarded)
{
var expr = new IncludeExpressionInfo(navigationSelector, IncludeTypeEnum.ThenInclude);
builder.Specification.Add(expr);
}
else
{
Specification<TEntity, TResult>.IsChainDiscarded = true;
Specification<TEntity>.IsChainDiscarded = true;
}

var includeBuilder = new IncludableSpecificationBuilder<TEntity, TResult, TProperty>(builder.Specification);
Expand Down Expand Up @@ -273,14 +273,14 @@ public static IIncludableSpecificationBuilder<TEntity, TResult, TProperty> ThenI
bool condition)
where TEntity : class
{
if (condition && !Specification<TEntity, TResult>.IsChainDiscarded)
if (condition && !Specification<TEntity>.IsChainDiscarded)
{
var expr = new IncludeExpressionInfo(navigationSelector, IncludeTypeEnum.ThenInclude);
builder.Specification.Add(expr);
}
else
{
Specification<TEntity, TResult>.IsChainDiscarded = true;
Specification<TEntity>.IsChainDiscarded = true;
}

var includeBuilder = new IncludableSpecificationBuilder<TEntity, TResult, TProperty>(builder.Specification);
Expand Down
Loading