request/src/request.persistence/_builders/OrderedBuilderExtensions.cs
2026-07-01 20:44:24 +02:00

80 lines
2.9 KiB
C#

// Copyright (c) The Geekeey Authors
// SPDX-License-Identifier: EUPL-1.2
using System.Linq.Expressions;
namespace Geekeey.Request.Persistence;
/// <summary>
/// Provides extension methods for <see cref="OrderedSpecificationBuilder{T}"/>.
/// </summary>
public static class OrderedBuilderExtensions
{
/// <summary>
/// Adds a ThenBy expression for secondary ordering.
/// </summary>
/// <param name="builder">The ordered builder.</param>
/// <param name="expression">The expression.</param>
/// <typeparam name="T">The entity type.</typeparam>
/// <returns>The ordered builder.</returns>
public static OrderedSpecificationBuilder<T> ThenBy<T>(this OrderedSpecificationBuilder<T> builder, Expression<Func<T, object?>> expression)
{
return ThenBy(builder, expression, condition: true);
}
/// <summary>
/// Adds a ThenBy expression when <paramref name="condition"/> is <see langword="true"/>.
/// </summary>
/// <param name="builder">The ordered builder.</param>
/// <param name="expression">The expression.</param>
/// <param name="condition">Whether to apply the ThenBy.</param>
/// <typeparam name="T">The entity type.</typeparam>
/// <returns>The ordered builder.</returns>
public static OrderedSpecificationBuilder<T> ThenBy<T>(this OrderedSpecificationBuilder<T> builder, Expression<Func<T, object?>> expression, bool condition)
{
if (condition && !builder.IsChainDiscarded)
{
builder.Builder.OrderExpressions.Add(new OrderExpressionInfo<T>(expression, OrderType.ThenBy));
}
else
{
builder.IsChainDiscarded = true;
}
return builder;
}
/// <summary>
/// Adds a ThenByDescending expression for secondary ordering.
/// </summary>
/// <param name="builder">The ordered builder.</param>
/// <param name="expression">The expression.</param>
/// <typeparam name="T">The entity type.</typeparam>
/// <returns>The ordered builder.</returns>
public static OrderedSpecificationBuilder<T> ThenByDescending<T>(this OrderedSpecificationBuilder<T> builder, Expression<Func<T, object?>> expression)
{
return ThenByDescending(builder, expression, condition: true);
}
/// <summary>
/// Adds a ThenByDescending expression when <paramref name="condition"/> is <see langword="true"/>.
/// </summary>
/// <param name="builder">The ordered builder.</param>
/// <param name="expression">The expression.</param>
/// <param name="condition">Whether to apply the ThenByDescending.</param>
/// <typeparam name="T">The entity type.</typeparam>
/// <returns>The ordered builder.</returns>
public static OrderedSpecificationBuilder<T> ThenByDescending<T>(this OrderedSpecificationBuilder<T> builder, Expression<Func<T, object?>> expression, bool condition)
{
if (condition && !builder.IsChainDiscarded)
{
builder.Builder.OrderExpressions.Add(new OrderExpressionInfo<T>(expression, OrderType.ThenByDescending));
}
else
{
builder.IsChainDiscarded = true;
}
return builder;
}
}