Skip to content

TcfOss.Filtering

Filtering, sorting, paging, and CSV/XLSX export libraries for .NET and TypeScript. Define requests with shared contracts, validate client field names with a mapper, and apply requests to IQueryable<T> queries.

Choose a Package

Need Package
Wire-format DTOs and constants TcfOss.Filtering.Contracts
Filtering, sorting, paging, and field selection TcfOss.Filtering.Linq
EF Core async queries and EF-aware parsing TcfOss.Filtering.EntityFrameworkCore
CSV export TcfOss.Filtering.CsvOutput
Excel export TcfOss.Filtering.XlsxOutput
Newtonsoft.Json filter deserialization TcfOss.Filtering.Contracts.Newtonsoft
ASP.NET Core malformed-filter handling TcfOss.Filtering.AspNetCore
Strongly typed filters constructed in C# TcfOss.Filtering.Programmatic
Frontend contracts and optional Zod schemas @tcfoss/filtering-contracts

Getting Started

Install the contracts and query packages for a .NET application:

dotnet add package TcfOss.Filtering.Contracts
dotnet add package TcfOss.Filtering.Linq

Construct a request with contract constants:

using TcfOss.Filtering.Contracts;

var request = new DataRequest
{
    Filter = new SimpleFilter("Name", FilterOperators.Contains, "smith"),
    Sorts = [new SortComponent("Name", SortDirections.Ascending)],
    Page = 1,
    PageSize = 20,
};

Before applying a client request to a query, use a mapper to validate field paths and parse values. See request mapping, including field whitelists and blacklists, and the LINQ usage examples.

For a TypeScript frontend:

npm install @tcfoss/filtering-contracts
import { FilterOperators, SortDirections } from '@tcfoss/filtering-contracts';
import type { DataRequest } from '@tcfoss/filtering-contracts';

const request: DataRequest = {
    filter: {
        filterType: 'simple',
        field: 'Name',
        operator: FilterOperators.Contains,
        value: 'smith',
    },
    sorts: [{ field: 'Name', direction: SortDirections.Ascending }],
    page: 1,
    pageSize: 20,
};

How It Fits Together

Frontend -> API -> Contracts DTOs -> Mapper -> LINQ filters -> IQueryable -> DataResult

The contracts define the wire format; LINQ applies validated requests to queries. Optional packages add EF Core integration, export writers, middleware, and JSON converters.

Guides and References

Source and Contributions

Browse the repository and runnable demo. Report bugs and feature requests on IssueTracker. Contribution guidance is in the repository README. The project is licensed under the MIT License.