Extension Methods
Every extension method lives in DynamicWhere.ex.Source.Extension and operates on IQueryable<T> — with IEnumerable<T> overloads for in-memory variants. The methods fall into four intents: projection, filtering, composition, and materialization.
Projection
Project a query into a typed shape or a dynamic shape. Both support direct properties, whole navigation objects, whole collections, and dotted paths through reference and collection navigations.
| Method | Signature | Returns | Async | Link |
|---|---|---|---|---|
Select | .Select<T>(List<string> fields) | IQueryable<T> | No | Docs |
SelectDynamic | .SelectDynamic<T>(List<string> fields) | IQueryable | No | Docs |
Filtering
Build the where-clause, group, order, or paginate the query — one building block at a time.
| Method | Signature | Returns | Async | Link |
|---|---|---|---|---|
Where | .Where<T>(Condition condition) | IQueryable<T> | No | Docs |
Where | .Where<T>(ConditionGroup group) | IQueryable<T> | No | Docs |
Group | .Group<T>(GroupBy groupBy) | IQueryable | No | Docs |
Order | .Order<T>(OrderBy) / .Order<T>(List<OrderBy>) | IQueryable<T> | No | Docs |
Page | .Page<T>(PageBy page) | IQueryable<T> | No | Docs |
Composition
Apply a complete Filter or Summary composition to the query. Each returns an IQueryable so you can chain further operations before materializing.
| Method | Signature | Returns | Async | Link |
|---|---|---|---|---|
Filter | .Filter<T>(Filter filter) | IQueryable<T> | No | Docs |
FilterDynamic | .FilterDynamic<T>(Filter filter) | IQueryable | No | Docs |
Summary | .Summary<T>(Summary summary) | IQueryable | No | Docs |
Materialization
Execute the composed query and return a paginated result — typed, dynamic, summary, or segment. The async overloads call EF Core's CountAsync and ToListAsync / ToDynamicListAsync under the hood.
| Method | Signature | Returns | Async | Link |
|---|---|---|---|---|
ToList (Filter) | .ToList<T>(Filter, bool getQueryString = false) | FilterResult<T> | No | Docs |
ToListAsync (Filter) | .ToListAsync<T>(Filter, bool getQueryString = false) | Task<FilterResult<T>> | Yes | Docs |
ToListDynamic (Filter) | .ToListDynamic<T>(Filter, bool getQueryString = false) | FilterResult<dynamic> | No | Docs |
ToListAsyncDynamic (Filter) | .ToListAsyncDynamic<T>(Filter, bool getQueryString = false) | Task<FilterResult<dynamic>> | Yes | Docs |
ToList (Summary) | .ToList<T>(Summary, bool getQueryString = false) | SummaryResult | No | Docs |
ToListAsync (Summary) | .ToListAsync<T>(Summary, bool getQueryString = false) | Task<SummaryResult> | Yes | Docs |
ToListAsync (Segment) | .ToListAsync<T>(Segment segment) | Task<SegmentResult<T>> | Yes (only) | Docs |
ToList<T>(Segment) variant. Each ConditionSet is materialized independently into memory, then set operations (Union / Intersect / Except) execute in-memory before ordering and pagination.In-memory overloads
The ToList / ToListDynamic (Filter and Summary) extensions also expose IEnumerable<T> overloads. These wrap the collection with AsQueryable() and delegate to the typed overload — handy for unit tests and in-process pipelines.
getQueryString: true to any materialization call to capture the generated SQL on the result. This requires an active EF Core provider; pure IEnumerable<T> use may not support .ToQueryString().