Vali-Flow 1.1.0

dotnet add package Vali-Flow --version 1.1.0
                    
NuGet\Install-Package Vali-Flow -Version 1.1.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Vali-Flow" Version="1.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Vali-Flow" Version="1.1.0" />
                    
Directory.Packages.props
<PackageReference Include="Vali-Flow" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Vali-Flow --version 1.1.0
                    
#r "nuget: Vali-Flow, 1.1.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#addin nuget:?package=Vali-Flow&version=1.1.0
                    
Install Vali-Flow as a Cake Addin
#tool nuget:?package=Vali-Flow&version=1.1.0
                    
Install Vali-Flow as a Cake Tool

Vali-Flow - Documentation

This document provides a comprehensive overview of the Vali-Flow library, a .NET library designed to simplify data access and validation in Entity Framework Core (EF Core) applications. The library offers a fluent API for building specifications (ValiFlow<T>), a robust evaluator (ValiFlowEvaluator<T>) for querying and modifying data, specification classes (QuerySpecification<T>, BasicSpecification<T>) for defining query criteria, and a generic repository (DbRepositoryAsync<T>) for clean data access patterns. The documentation includes detailed descriptions, code examples, tables, and usage instructions.

Table of Contents

  1. Overview
  2. Core Components
  3. Specification Components
  4. Repository Components
  5. Component Summary
  6. Usage
  7. Implementation Details
  8. Dependencies
  9. Extensibility
  10. Features and Enhancements 🌟
  11. Code Structure

Overview

Vali-Flow is a .NET library that streamlines data access and validation in EF Core applications. It provides a fluent API for constructing complex query and validation specifications, a powerful evaluator for executing these specifications, and a generic repository for clean data access. The library is designed for clean architecture, separating concerns and promoting reusability.

Key features:

  • Fluent Specification API: Build complex queries and validations using ValiFlow<T> and specification classes.
  • Asynchronous Data Access: All operations are asynchronous, supporting scalable applications.
  • Generic Design: Works with any entity type T, reducing code duplication.
  • Extensible Repository: DbRepositoryAsync<T> integrates with the evaluator for clean data access.
  • Robust Error Handling: Includes validation and exception handling for reliable operations.
  • Dependency Injection: Seamlessly integrates with ASP.NET Core.

The library is organized into core components (specifications and evaluation), specification components (query criteria), and repository components (data access).

Core Components

ValiFlow<T>

ValiFlow<T> is a fluent API for building specifications that define query filters, validations, or conditions for entities of type T. It resides in the Vali-Flow.Core namespace and supports chaining methods to construct complex logic.

Key Features:

  • Supports building filters, validations, and query conditions.
  • Provides methods like Build() and BuildNegated() to generate Expression<Func<T, bool>>.
  • Used by ValiFlowEvaluator<T> and specification classes to define criteria.

Code Example:

using Vali_Flow.Core;

var spec = new ValiFlow<Product>()
    .Add(p => p.Price > 100)
    .Add(p => p.Category == "Electronics");
Expression<Func<Product, bool>> filter = spec.Build();

IEvaluatorRead<T>

IEvaluatorRead<T> defines methods for querying data asynchronously, supporting filtering, grouping, aggregation, and pagination.

Method Summary:

Method Description Parameters Return Type
EvaluateAsync Evaluates condition on entity ValiFlow<T>, T Task<bool>
EvaluateAnyAsync Checks for matching entities IBasicSpecification<T>, CancellationToken Task<bool>
EvaluateCountAsync Counts matching entities IBasicSpecification<T>, CancellationToken Task<int>
EvaluateGetFirstAsync Gets first matching entity IBasicSpecification<T>, CancellationToken Task<T?>
EvaluateGetFirstFailedAsync Gets first non-matching entity IBasicSpecification<T>, CancellationToken Task<T?>
EvaluateGetLastAsync Gets last matching entity IBasicSpecification<T>, CancellationToken Task<T?>
EvaluateGetLastFailedAsync Gets last non-matching entity IBasicSpecification<T>, CancellationToken Task<T?>
EvaluateQueryAsync Builds query for matching entities IQuerySpecification<T> Task<IQueryable<T>>
EvaluateQueryFailedAsync Builds query for non-matching IQuerySpecification<T> Task<IQueryable<T>>
EvaluateDistinctAsync<TKey> Gets distinct entities IQuerySpecification<T>, Expression<Func<T, TKey>> Task<IQueryable<T>>
EvaluateDuplicatesAsync<TKey> Gets duplicate entities IQuerySpecification<T>, Expression<Func<T, TKey>> Task<IQueryable<T>>
EvaluateMinAsync<TResult> Computes minimum value IBasicSpecification<T>, Expression<Func<T, TResult>>, CancellationToken Task<TResult>
EvaluateMaxAsync<TResult> Computes maximum value IBasicSpecification<T>, Expression<Func<T, TResult>>, CancellationToken Task<TResult>
EvaluateAverageAsync<TResult> Computes average value IBasicSpecification<T>, Expression<Func<T, TResult>>, CancellationToken Task<decimal>
EvaluateSumAsync Computes sum of selector IBasicSpecification<T>, Expression<Func<T, TNum>>, CancellationToken Task<TNum>
EvaluateAggregateAsync<TResult> Applies custom aggregator IBasicSpecification<T>, Expression<Func<T, TResult>>, Func<TResult, TResult, TResult>, CancellationToken Task<TResult>
EvaluateGroupedAsync<TKey> Groups entities by key IBasicSpecification<T>, Expression<Func<T, TKey>>, CancellationToken Task<Dictionary<TKey, List<T>>>
EvaluateCountByGroupAsync<TKey> Counts entities per group IBasicSpecification<T>, Expression<Func<T, TKey>>, CancellationToken Task<Dictionary<TKey, int>>
EvaluateSumByGroupAsync<TKey> Sums values per group IBasicSpecification<T>, Expression<Func<T, TKey>>, Expression<Func<T, TNum>>, CancellationToken Task<Dictionary<TKey, TNum>>
EvaluateMinByGroupAsync<TKey> Gets minimum per group IBasicSpecification<T>, Expression<Func<T, TKey>>, Expression<Func<T, TNum>>, CancellationToken Task<Dictionary<TKey, TNum>>
EvaluateMaxByGroupAsync<TKey> Gets maximum per group IBasicSpecification<T>, Expression<Func<T, TKey>>, Expression<Func<T, TNum>>, CancellationToken Task<Dictionary<TKey, TNum>>
EvaluateAverageByGroupAsync<TKey, TResult> Averages values per group IBasicSpecification<T>, Expression<Func<T, TKey>>, Expression<Func<T, TResult>>, CancellationToken Task<Dictionary<TKey, decimal>>
EvaluateDuplicatesByGroupAsync<TKey> Gets duplicate groups IBasicSpecification<T>, Expression<Func<T, TKey>>, CancellationToken Task<Dictionary<TKey, List<T>>>
EvaluateUniquesByGroupAsync<TKey> Gets unique groups IBasicSpecification<T>, Expression<Func<T, TKey>>, CancellationToken Task<Dictionary<TKey, T>>
EvaluateTopByGroupAsync<TKey> Gets top entities per group IQuerySpecification<T>, Expression<Func<T, TKey>>, CancellationToken Task<Dictionary<TKey, List<T>>>

IEvaluatorWrite<T>

IEvaluatorWrite<T> defines methods for modifying data asynchronously, including adding, updating, deleting, and bulk operations.

Method Summary:

Method Description Parameters Return Type
AddAsync Adds a single entity T, bool saveChanges, CancellationToken Task<T>
AddRangeAsync Adds multiple entities IEnumerable<T>, bool saveChanges, CancellationToken Task<IEnumerable<T>>
UpdateAsync Updates a single entity T, bool saveChanges, CancellationToken Task<T>
UpdateRangeAsync Updates multiple entities IEnumerable<T>, bool saveChanges, CancellationToken Task<IEnumerable<T>>
DeleteAsync Deletes a single entity T, bool saveChanges, CancellationToken Task
DeleteRangeAsync Deletes multiple entities IEnumerable<T>, bool saveChanges, CancellationToken Task
SaveChangesAsync Persists changes CancellationToken Task
UpsertAsync Adds or updates entity T, Expression<Func<T, bool>>, bool saveChanges, CancellationToken Task<T>
UpsertRangeAsync<TProperty> Adds or updates entities IEnumerable<T>, Func<T, TProperty>, bool saveChanges, CancellationToken Task<IEnumerable<T>>
DeleteByConditionAsync Deletes by condition Expression<Func<T, bool>>, bool saveChanges, CancellationToken Task
ExecuteTransactionAsync Executes in transaction Func<Task>, CancellationToken Task
BulkInsertAsync Performs bulk insert IEnumerable<T>, BulkConfig?, CancellationToken Task
BulkUpdateAsync Performs bulk update IEnumerable<T>, BulkConfig?, CancellationToken Task
BulkDeleteAsync Performs bulk delete IEnumerable<T>, BulkConfig?, CancellationToken Task
BulkInsertOrUpdateAsync Performs bulk insert/update IEnumerable<T>, BulkConfig?, CancellationToken Task

ValiFlowEvaluator<T>

ValiFlowEvaluator<T> is the core class that implements IEvaluatorRead<T> and IEvaluatorWrite<T>. It provides the logic for querying and modifying data using EF Core, leveraging ValiFlow<T> and specification classes.

Key Features:

  • Accepts a DbContext for database operations.
  • Implements all methods from IEvaluatorRead<T> and IEvaluatorWrite<T>.
  • Supports advanced querying (e.g., grouping, aggregation) and bulk operations.
  • Uses QuerySpecification<T> and BasicSpecification<T> for query composition.

Code Example:

using Vali_Flow.Classes.Evaluators;

public class ValiFlowEvaluator<T> : IEvaluatorRead<T>, IEvaluatorWrite<T> where T : class
{
    private readonly DbContext _dbContext;

    public ValiFlowEvaluator(DbContext dbContext)
    {
        _dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext), "The provided DbContext is null.");
    }

    // Implementation details omitted for brevity
}

Specification Components

BasicSpecification<T>

BasicSpecification<T> is a base class for defining simple query specifications, including filters, inclusions, and EF Core configurations (e.g., change tracking, split queries). It implements IBasicSpecification<T> and resides in the Vali_Flow.Classes.Specification namespace.

Key Features:

  • Defines a ValiFlow<T> filter for query criteria.
  • Supports including related entities via AddInclude.
  • Configures EF Core options like AsNoTracking, AsSplitQuery, and IgnoreQueryFilters.
  • Provides chainable methods for fluent configuration.

Method Summary:

Method Description Parameters Return Type
WithFilter Updates validation filter ValiFlow<T> BasicSpecification<T>
AddInclude<TProperty> Adds related entity include Expression<Func<T, TProperty>> BasicSpecification<T>
WithAsNoTracking Configures change tracking bool asNoTracking BasicSpecification<T>
WithAsSplitQuery Configures split queries bool asSplitQuery BasicSpecification<T>
WithIgnoreQueryFilters Ignores global query filters bool ignoreQueryFilters BasicSpecification<T>

Code Example:

using System.Linq.Expressions;
using Vali_Flow.Classes.Specification;
using Vali_Flow.Core;

var spec = new BasicSpecification<Product>(new ValiFlow<Product>().Add(p => p.Price > 100))
    .AddInclude(p => p.Category)
    .WithAsNoTracking(true)
    .WithIgnoreQueryFilters(true);

QuerySpecification<T>

QuerySpecification<T> extends BasicSpecification<T> and implements IQuerySpecification<T>. It adds support for ordering, pagination, and limiting the number of results, making it ideal for complex queries.

Key Features:

  • Supports primary ordering (WithOrderBy) and secondary ordering (AddThenBy, AddThenBys).
  • Configures pagination (WithPagination, WithPage, WithPageSize) and maximum items (WithTop).
  • Inherits filter and inclusion capabilities from BasicSpecification<T>.

Method Summary:

Method Description Parameters Return Type
WithOrderBy<TProperty> Sets primary ordering Expression<Func<T, TProperty>>, bool ascending QuerySpecification<T>
AddThenBy<TProperty> Adds secondary ordering Expression<Func<T, TProperty>>, bool ascending QuerySpecification<T>
AddThenBys<TProperty> Adds multiple ordering IEnumerable<Expression<Func<T, TProperty>>>, bool ascending QuerySpecification<T>
WithPagination Configures pagination int page, int pageSize QuerySpecification<T>
WithPage Sets page number int page QuerySpecification<T>
WithPageSize Sets page size int pageSize QuerySpecification<T>
WithTop Limits number of items int top QuerySpecification<T>

Code Example:

using System.Linq.Expressions;
using Vali_Flow.Classes.Specification;
using Vali_Flow.Core;

var spec = new QuerySpecification<Product>(new ValiFlow<Product>().Add(p => p.Price > 100))
    .WithOrderBy(p => p.Price, false)
    .AddThenBy(p => p.Name)
    .WithPagination(2, 10)
    .WithTop(50);

Repository Components

ApplicationDbContext

ApplicationDbContext is the EF Core DbContext used for database interactions in the repository layer. It defines the database schema and configures the connection to a SQL Server database.

Key Features:

  • Inherits from Microsoft.EntityFrameworkCore.DbContext.
  • Configured via DbContextOptions<ApplicationDbContext>.
  • Used by DbRepositoryAsync<T> and passed to ValiFlowEvaluator<T>.

Code Example:

namespace Infrastructure.Data;

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {
    }

    // Example DbSet properties
    // public DbSet<Product> Products { get; set; }
}

IReadRepositoryAsync<T>

IReadRepositoryAsync<T> is an interface for read-only data operations, inheriting from IEvaluatorRead<T>.

Key Features:

  • Provides access to all query methods defined in IEvaluatorRead<T>.
  • Generic constraint ensures T is a class.
  • Can be extended with additional methods.

Code Example:

namespace Application.Interfaces.ValiFlow;

public interface IReadRepositoryAsync<T> : IEvaluatorRead<T> where T : class
{
    // Inherits methods from IEvaluatorRead<T>
}

IWriteRepositoryAsync<T>

IWriteRepositoryAsync<T> is an interface for write operations, inheriting from IEvaluatorWrite<T>.

Key Features:

  • Provides access to all write methods defined in IEvaluatorWrite<T>.
  • Generic constraint ensures T is a class.
  • Supports bulk operations.

Code Example:

namespace Application.Interfaces.ValiFlow;

public interface IWriteRepositoryAsync<T> : IEvaluatorWrite<T> where T : class
{
    // Inherits methods from IEvaluatorWrite<T>
}

DbRepositoryAsync<T>

DbRepositoryAsync<T> is a generic repository class that extends ValiFlowEvaluator<T> and implements IReadRepositoryAsync<T> and IWriteRepositoryAsync<T>. It provides a clean interface for data access.

Key Features:

  • Inherits all method implementations from ValiFlowEvaluator<T>.
  • Uses ApplicationDbContext for database interactions.
  • Validates ApplicationDbContext to ensure it is not null.
  • Extensible for custom methods or overrides.

Code Example:

namespace Infrastructure.Repositories;

public class DbRepositoryAsync<T> : ValiFlowEvaluator<T>, IReadRepositoryAsync<T>, IWriteRepositoryAsync<T> where T : class
{
    private readonly ApplicationDbContext _dbContext;

    public DbRepositoryAsync(ApplicationDbContext dbContext) : base(dbContext)
    {
        _dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext), "The provided DbContext is null.");
    }
}

Dependency Injection

The dependency injection setup registers ApplicationDbContext and DbRepositoryAsync<T> with the ASP.NET Core dependency injection container.

Key Features:

  • Configures ApplicationDbContext with a SQL Server connection string.
  • Registers DbRepositoryAsync<T> for both IReadRepositoryAsync<T> and IWriteRepositoryAsync<T>.

Dependency Injection Summary:

Service Implementation Scope Description
ApplicationDbContext ApplicationDbContext Scoped EF Core database access
IReadRepositoryAsync<T> DbRepositoryAsync<T> Scoped Read-only data access
IWriteRepositoryAsync<T> DbRepositoryAsync<T> Scoped Data modification methods

Code Example:

namespace Infrastructure;

public static class DependencyInjection
{
    public static IServiceCollection AddInfrastructure(this IServiceCollection services, string connectionString)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(connectionString));

        services.AddScoped(typeof(IReadRepositoryAsync<>), typeof(DbRepositoryAsync<>));
        services.AddScoped(typeof(IWriteRepositoryAsync<>), typeof(DbRepositoryAsync<>));

        return services;
    }
}

Component Summary :

Component Namespace Description
ValiFlow<T> Vali_Flow.Core Fluent API for specifications
IEvaluatorRead<T> Vali_Flow.Interfaces.Evaluators.Read Read-only data operations
IEvaluatorWrite<T> Vali_Flow.Interfaces.Evaluators.Write Data modification operations
ValiFlowEvaluator<T> Vali_Flow.Classes.Evaluators Data access logic
BasicSpecification<T> Vali_Flow.Classes.Specification Simple query specifications
QuerySpecification<T> Vali_Flow.Classes.Specification Complex query specifications
ApplicationDbContext Infrastructure.Data EF Core database context
IReadRepositoryAsync<T> Application.Interfaces.ValiFlow Read repository interface
IWriteRepositoryAsync<T> Application.Interfaces.ValiFlow Write repository interface
DbRepositoryAsync<T> Infrastructure.Repositories Generic repository
DependencyInjection Infrastructure DI configuration

Usage

The Vali-Flow library can be used in three primary ways:

  1. Core Usage: Use ValiFlow<T> and ValiFlowEvaluator<T> for specification-based data access.
  2. Specification Usage: Use BasicSpecification<T> or QuerySpecification<T> for complex query composition.
  3. Repository Usage: Use DbRepositoryAsync<T> for clean data access patterns.

Core Usage Example:

var evaluator = new ValiFlowEvaluator<Product>(dbContext);
var spec = new QuerySpecification<Product>(new ValiFlow<Product>().Add(p => p.Price > 100));
var products = await evaluator.EvaluateQueryAsync(spec);
var count = await evaluator.EvaluateCountAsync(spec);

Specification Usage Example:

var spec = new QuerySpecification<Product>()
    .WithFilter(new ValiFlow<Product>().Add(p => p.Price > 100))
    .WithOrderBy(p => p.Price, false)
    .AddInclude(p => p.Category)
    .WithPagination(1, 20);
var evaluator = new ValiFlowEvaluator<Product>(dbContext);
var products = await evaluator.EvaluateQueryAsync(spec);

Repository Usage Example:

public class ProductService
{
    private readonly IReadRepositoryAsync<Product> _readRepository;
    private readonly IWriteRepositoryAsync<Product> _writeRepository;

    public ProductService(
        IReadRepositoryAsync<Product> readRepository,
        IWriteRepositoryAsync<Product> writeRepository)
    {
        _readRepository = readRepository;
        _writeRepository = writeRepository;
    }

    public async Task<Product> AddProductAsync(Product product)
    {
        return await _writeRepository.AddAsync(product);
    }

    public async Task<Product?> GetProductByIdAsync(int id)
    {
        var spec = new QuerySpecification<Product>(new ValiFlow<Product>().Add(p => p.Id == id));
        return await _readRepository.EvaluateGetFirstAsync(spec);
    }
}

Service Configuration:

using Infrastructure;

var builder = WebApplication.CreateBuilder(args);

// Configure services
var connectionString = "Server=.;Database=MyDb;Trusted_Connection=True;";
builder.Services.AddInfrastructure(connectionString);
builder.Services.AddScoped<ProductService>();

var app = builder.Build();

// Configure the HTTP request pipeline (example)
app.MapGet("/", () => "Hello, World!");

app.Run();

Implementation Details

  • ValiFlow<T>: Provides a fluent API for constructing Expression<Func<T, bool>> expressions, used by specifications and evaluators.
  • BasicSpecification<T>: Defines basic query criteria, including filters and inclusions, with EF Core-specific configurations.
  • QuerySpecification<T>: Extends BasicSpecification<T> to support ordering, pagination, and limiting results.
  • ValiFlowEvaluator<T>: Implements the core logic for querying and modifying data, using EF Core and specifications.
  • DbRepositoryAsync<T>: Extends ValiFlowEvaluator<T> to provide a repository pattern, inheriting all data access methods.
  • Error Handling: Includes validation (e.g., null checks, pagination constraints) and exception handling across components.
  • Asynchronous Design: All methods are asynchronous, ensuring scalability.

Dependencies

The Vali-Flow library relies on the following NuGet packages:

  • Vali_Flow.Core:
    • Description: Vali_Flow.Core is a component of the Vali-Flow library for managing validations in .NET in a fluent and expressive way. It allows developers to define data validations and query specifications using chained expressions, making code writing and maintenance easier. Compatible with multiple data types, it provides intuitive methods for validating strings, dates, collections, and general comparisons.
    • Release Notes:
      • New integration of the specification pattern into the methods.
      • Improved stability and compatibility with Vali-Flow library components.
      • New methods for reading (batch read data) and writing with Entity Framework Core.
    • Compatible with: .NET 7, .NET 8, .NET 9
    • Available at https://www.nuget.org/packages/Vali-Flow.Core/.
  • Microsoft.EntityFrameworkCore: Core EF Core functionality for database operations.
  • EFCore.BulkExtensions: Support for bulk operations to enhance performance.

NuGet Packages:

<PackageReference Include="Vali_Flow.Core" Version="1.0.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.0" />
<PackageReference Include="EFCore.BulkExtensions" Version="8.0.0" />

Extensibility

The library is highly extensible:

  • Custom Specifications: Extend ValiFlow<T>, BasicSpecification<T>, or QuerySpecification<T> with new methods.
  • Evaluator Overrides: Derive from ValiFlowEvaluator<T> to customize query or write logic.
  • Repository Methods: Add custom methods to DbRepositoryAsync<T> for application-specific needs.
  • Interface Extensions: Add methods to IReadRepositoryAsync<T> or IWriteRepositoryAsync<T>.

Example: Adding a Custom Repository Method:

public class DbRepositoryAsync<T> : ValiFlowEvaluator<T>, IReadRepositoryAsync<T>, IWriteRepositoryAsync<T> where T : class
{
    private readonly ApplicationDbContext _dbContext;

    public DbRepositoryAsync(ApplicationDbContext dbContext) : base(dbContext)
    {
        _dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext), "The provided DbContext is null.");
    }

    public async Task<IEnumerable<T>> GetByCustomFilterAsync(Expression<Func<T, bool>> filter)
    {
        var spec = new QuerySpecification<T>(new ValiFlow<T>().Add(filter));
        var query = await EvaluateQueryAsync(spec);
        return await query.ToListAsync();
    }
}

Features and Enhancements 🌟

The Vali-Flow library is actively developed with new features and improvements to enhance its functionality and usability.

Recent Updates

  • Enhanced Expression Building: Improved Vali-Flow.Core to support more complex and reusable expression composition, enabling developers to create dynamic and scalable query filters with ease.
  • Optimized Specification Evaluation: Enhanced ValiFlowEvaluator<T> to improve performance for complex specifications, including better handling of includes, pagination, and grouping operations.
  • Bulk Operation Improvements: Optimized bulk operations (e.g., BulkInsertAsync, BulkUpdateAsync) in Vali-Flow for faster data manipulation, with improved integration with EF Core and Vali-Flow.Core specifications.
  • Multi-targeting Support: Added support for .NET 7, 8, and 9, ensuring Vali-Flow’s compatibility with modern .NET ecosystems.

Planned Features

  • Request Pre-processing and Post-processing Hooks: Support for hooks to execute custom logic before and after request processing in Vali-Flow, enhancing flexibility for specification and query execution.
  • Enhanced Debugging Tools: Improved tools for debugging pipeline execution in Vali-Flow, providing better insights into operation flows for specification evaluation and data access.

Follow the project on GitHub for updates on new features and improvements!

Donations 💖

If you find Vali-Flow useful and would like to support its development, consider making a donation:

Your contributions help keep this project alive and improve its development! 🚀

License 📜

This project is licensed under the Apache License 2.0.

Contributions 🤝

Feel free to open issues and submit pull requests to improve this library!

Product Compatible and additional computed target framework versions.
.NET net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.1.0 132 4/28/2025
1.0.1 111 2/12/2025
1.0.0 109 2/10/2025

-Enhanced Expression Building: Improved Vali_Flow.Core to support more complex and reusable expression composition, enabling developers to create dynamic and scalable query filters with ease.
           -Optimized Specification Evaluation: Enhanced ValiFlowEvaluator to improve performance for complex specifications, including better handling of includes, pagination, and grouping operations.
           -Bulk Operation Improvements: Optimized bulk operations (e.g., BulkInsertAsync, BulkUpdateAsync) in Vali_Flow for faster data manipulation, with improved integration with EF Core and Vali_Flow.Core specifications.