Skip to content

API Reference

AmirHosseinMp02 edited this page Aug 1, 2026 · 1 revision

API Reference

Every public type and member, by package. Behaviour is described on the linked pages; this is the signature list.

All packages target .NET 10 and are version 2.0.0.


PepperX.QueryForge

No dependencies. Namespace PepperX.QueryForge unless stated.

Query model

publicclassQuery{publicQueryCriteriaCriteria{get;set;}publicQueryPagingPaging{get;set;}publicIReadOnlyList<string>SelectColumns{get;set;}publicIReadOnlyList<SortDescriptor>SortColumns{get;set;}publicIReadOnlyList<GroupByDescriptor>GroupByColumns{get;set;}}publicrecordQueryCriteria{publicIReadOnlyList<ConditionGroup>Groups{get;init;}publicLogicLogic{get;init;}publicQueryCriteria(IReadOnlyList<ConditionGroup>?groups=null,Logiclogic=Logic.And);}publicrecordConditionGroup{publicIReadOnlyList<Condition>Conditions{get;init;}publicLogicLogic{get;init;}publicConditionGroup(IReadOnlyList<Condition>?conditions=null,Logiclogic=Logic.And);}publicrecordCondition(stringColumnName,ConditionOperatorOperator,object?Value=null,object?ValueTo=null);publicrecordQueryPaging(intSize=12,intNumber=1);publicrecordSortDescriptor(stringColumnName,SortOrderSortOrder=SortOrder.Ascending):IColumnDescriptor;publicrecordGroupByDescriptor(stringColumnName,SortOrderSortOrder=SortOrder.Ascending):IColumnDescriptor;publicinterfaceIColumnDescriptor{stringColumnName{get;}}

See Query Model.

Enumerations

publicenumLogic{And,Or,AndNot,OrNot}// 0, 1, 2, 3publicenumSortOrder{Ascending,Descending}// 0, 1publicenumQueryResultType{Flat,Grouped}// 0, 1publicenumQueryValidationMode{SilentStrip,ThrowException}// 0, 1publicenumConditionOperator{Equals,NotEquals,Contains,NotContains,// 0, 1, 2, 3StartsWith,EndsWith,LessThan,GreaterThan,// 4, 5, 6, 7LessThanOrEqualTo,GreaterThanOrEqualTo,Between// 8, 9, 10}

Results

publicrecordQueryResult<TModel>{publicQueryResultMetaMeta{get;init;}publicIReadOnlyList<TModel>Models{get;init;}publicIReadOnlyList<HierarchyNode<TModel>>Groups{get;init;}}publicrecordQueryResultMeta(QueryResultMetaTotalTotal,QueryResultTypeType);publicrecordQueryResultMetaTotal(intRows,intPages);publicrecordHierarchyNode<TModel>(object?Key,intCount,IReadOnlyList<HierarchyNode<TModel>>?SubGroups,IReadOnlyList<TModel>?Items);

See Results and Metadata.

Builders

publicstaticclassQueryBuilder{publicstaticQueryFluentNew();publicstaticQueryFluentSelect(paramsstring[]columns);publicstaticQueryFluentWhere(QueryCriteriacriteria);publicstaticQueryFluentSort(paramsSortDescriptor[]sorts);publicstaticQueryFluentGroupBy(paramsGroupByDescriptor[]groups);publicstaticQueryFluentPage(intsize,intnumber=1);}publicclassQueryFluent{publicQueryFluent();publicQueryFluent(Queryquery);publicQueryFluentSelect(paramsstring[]columns);publicQueryFluentWhere(QueryCriteriacriteria);publicQueryFluentSort(paramsSortDescriptor[]sorts);publicQueryFluentGroupBy(paramsGroupByDescriptor[]groups);publicQueryFluentPage(intsize,intnumber=1);publicQueryBuild();}

See Fluent Builders.

Validation

publicstaticclassQueryValidationExtensions{publicstaticQueryValidate(thisQueryquery,Action<QueryValidationRules>configure,QueryValidationModemode=QueryValidationMode.SilentStrip);publicstaticQueryValidate(thisQueryquery,QueryValidationRulesrules,QueryValidationModemode=QueryValidationMode.SilentStrip);// Extension points used by provider-specific validators.publicstaticvoidApplyBaseRules(Queryquery,QueryValidationRulesrules,List<string>errors,QueryValidationModemode);publicstaticvoidThrowIfErrors(List<string>errors,QueryValidationModemode);}publicclassQueryValidationRules{publicQueryValidationRulesPageSize(Action<QueryPagingRuleBuilder>configure);publicQueryValidationRulesSelect(Action<QueryColumnRuleBuilder>configure);publicQueryValidationRulesSort(Action<QueryColumnRuleBuilder>configure);publicQueryValidationRulesGroupBy(Action<QueryColumnRuleBuilder>configure);publicQueryValidationRulesWhere(Action<QueryColumnRuleBuilder>configure);}publicclassQueryColumnRuleBuilder{publicQueryColumnRuleBuilderAllow(paramsstring[]columns);publicQueryColumnRuleBuilderDeny(paramsstring[]columns);}publicclassQueryPagingRuleBuilder{publicQueryPagingRuleBuilderMax(intmax);publicQueryPagingRuleBuilderMin(intmin);}publicclassQueryValidationException:Exception{publicIReadOnlyList<string>InvalidProperties{get;}publicQueryValidationException(stringmessage,IReadOnlyList<string>invalidProperties);}publicclassQueryColumnRule{}// rule state; configured through the builderpublicclassQueryPagingRule{}// rule state; configured through the builder

See Validation.

Shared semantics

Namespace PepperX.QueryForge.Querying. These are the rules every provider routes through — public so a custom provider can reuse them.

publicstaticclassConditionSemantics{publicstaticboolIsDisjunction(Logiclogic);// Or / OrNot → truepublicstaticboolIsNegated(Logiclogic);// AndNot / OrNot → truepublicstaticboolIsExecutable(Conditioncondition);// does this contribute a predicatepublicstaticboolIsPatternOperator(ConditionOperatorop);publicstaticobject?Unwrap(object?value);// JsonElement / DBNull → CLR value}publicstaticclassValueCoercion{publicstaticboolTryCoerce(object?value,TypetargetType,outobject?result);}publicsealedclassQueryValueComparer:IComparer<object?>{publicstaticreadonlyQueryValueComparerInstance;publicintCompare(object?x,object?y);publicboolAreEqual(object?x,object?y);}publicstaticclassHierarchyBuilder{publicstaticIReadOnlyList<HierarchyNode<TModel>>Build<TModel>(IReadOnlyList<TModel>rows,IReadOnlyList<GroupByDescriptor>groups,Func<TModel,string,object?>?valueAccessor=null);}publicstaticclassProjectionShaper{publicstaticTModelShape<TModel>(TModelsource,IReadOnlyList<string>selectColumns,IReadOnlyList<string>?alsoKeep=null);publicstaticIReadOnlyList<TModel>ShapeAll<TModel>(IReadOnlyList<TModel>rows,IReadOnlyList<string>selectColumns,IReadOnlyList<string>?alsoKeep=null);publicstaticIReadOnlyList<HierarchyNode<TModel>>ShapeHierarchy<TModel>(IReadOnlyList<HierarchyNode<TModel>>nodes,IReadOnlyList<string>selectColumns,IReadOnlyList<string>?alsoKeep=null);}publicstaticclassPropertyAccessor{publicstaticFunc<TModel,string,object?>For<TModel>();publicstaticboolExists<TModel>(string?columnName);}publicstaticclassInMemoryQueryEngine{publicstaticQueryResult<TModel>Apply<TModel>(IEnumerable<TModel>source,Queryquery,Func<TModel,string,object?>?valueAccessor=null);publicstaticboolMatches<TModel>(TModelrow,QueryCriteriacriteria,Func<TModel,string,object?>accessor,Func<string,bool>?columnExists=null);}

See Query Semantics.


PepperX.QueryForge.Dapper

Depends on Dapper 2.1.79 and Microsoft.Extensions.DependencyInjection.Abstractions 10.0.9. No database driver.

Query model additions

Namespace PepperX.QueryForge.Dapper.

publicclassDapperQuery:PepperX.QueryForge.Query{publicDapperQueryObject?Object{get;set;}}publicrecordDapperQueryObject(stringName,stringSchema="",DapperObjectTypeType=DapperObjectType.Auto,IReadOnlyDictionary<string,object?>?Parameters=null);publicenumDapperObjectType{Auto=0,Table=1,View=2,TVF=3,SP=4}publicenumDapperDatabaseProvider{MSSQL,MySQL,PostgreSQL,Oracle,SQLite}

Services and registration

publicinterfaceIDapperQueryService{Task<QueryResult<TModel>>QueryAsync<TModel>(IDbConnectionconnection,DapperQueryquery,int?commandTimeout=null,IDbTransaction?transaction=null);Task<QueryResult<TModel>>QueryAsync<TModel>(DapperQueryquery,int?commandTimeout=null,IDbTransaction?transaction=null);}publicstaticclassDapperQueryForgeConnectionExtensions{publicstaticTask<QueryResult<TModel>>QueryForgeAsync<TModel>(thisIDbConnectionconnection,DapperQueryquery,int?commandTimeout=null,IDbTransaction?transaction=null);}publicstaticclassDapperServiceCollectionExtensions{publicstaticIServiceCollectionAddQueryForgeDapper(thisIServiceCollectionservices,Action<DapperQueryForgeOptions>?configure=null);publicstaticIServiceCollectionAddQueryForgeDialect(thisIServiceCollectionservices,ISqlDialectdialect);}publicclassDapperQueryForgeOptions{publicFunc<IServiceProvider,IDbConnection>?ConnectionFactory{get;set;}}

See Dapper Provider.

Builder

publicstaticclassDapperQueryBuilder{publicstaticDapperQueryFluentNew();publicstaticDapperQueryFluentNew(DapperQuerydapperQuery);publicstaticDapperQueryFluentFromBase(QuerybaseQuery);publicstaticDapperQueryFluentForObject(stringname,stringschema="",DapperObjectTypetype=DapperObjectType.Auto,IReadOnlyDictionary<string,object?>?parameters=null);publicstaticDapperQueryFluentSelect(paramsstring[]columns);publicstaticDapperQueryFluentWhere(QueryCriteriacriteria);publicstaticDapperQueryFluentSort(paramsSortDescriptor[]sorts);publicstaticDapperQueryFluentGroupBy(paramsGroupByDescriptor[]groups);publicstaticDapperQueryFluentPage(intsize,intnumber=1);}publicclassDapperQueryFluent:QueryFluent{publicDapperQueryFluent(DapperQueryquery);publicstaticDapperQueryFluentFromBase(QuerybaseQuery);publicDapperQueryFluentForObject(stringname,stringschema="",DapperObjectTypetype=DapperObjectType.Auto,IReadOnlyDictionary<string,object?>?parameters=null);publicnewDapperQueryFluentSelect(paramsstring[]columns);publicnewDapperQueryFluentWhere(QueryCriteriacriteria);publicnewDapperQueryFluentSort(paramsSortDescriptor[]sorts);publicnewDapperQueryFluentGroupBy(paramsGroupByDescriptor[]groups);publicnewDapperQueryFluentPage(intsize,intnumber=1);publicnewDapperQueryBuild();}

Note DapperQueryBuilder is in the global namespace, so it needs no using beyond PepperX.QueryForge.Dapper for its parameter types.

Validation additions

publicstaticclassDapperQueryValidationExtensions{publicstaticDapperQueryValidate(thisDapperQueryquery,Action<DapperQueryValidationRules>configure,QueryValidationModemode=QueryValidationMode.SilentStrip);}publicclassDapperQueryValidationRules:QueryValidationRules{publicDapperQueryValidationRulesObject(Action<DapperObjectRuleBuilder>configure);}publicclassDapperObjectRuleBuilder{publicDapperObjectRuleBuilderAllowSchema(paramsstring[]schemas);publicDapperObjectRuleBuilderDenySchema(paramsstring[]schemas);publicDapperObjectRuleBuilderAllowTable(paramsstring[]tables);publicDapperObjectRuleBuilderDenyTable(paramsstring[]tables);publicDapperObjectRuleBuilderRequireName(boolrequire=true);}publicclassDapperObjectRule{}// rule state; configured through the builder

See Validation.

Compiler

Namespace PepperX.QueryForge.Dapper.Compiler.

publicsealedclassSqlQueryCompiler{publicSqlQueryCompiler(ISqlDialectdialect);publicISqlDialectDialect{get;}publicCompiledSqlCompileSchemaProbe(DapperQueryquery);publicCompiledSqlCompileRows(DapperQueryquery,ColumnWhitelistcolumns);publicCompiledSqlCompileRowCount(DapperQueryquery,ColumnWhitelistcolumns);publicCompiledSqlCompileGroupKeys(DapperQueryquery,ColumnWhitelistcolumns);publicCompiledSqlCompileGroupCount(DapperQueryquery,ColumnWhitelistcolumns);publicCompiledSqlCompileGroupRows(DapperQueryquery,ColumnWhitelistcolumns,IReadOnlyList<object?>groupKeys);}publicsealedrecordCompiledSql(stringText,IReadOnlyDictionary<string,object?>Parameters);publicsealedclassColumnWhitelist{publicColumnWhitelist(IEnumerable<string>columns);publicColumnWhitelist(IEnumerable<KeyValuePair<string,Type?>>columns);publicIReadOnlyCollection<string>Columns{get;}publicboolContains(string?columnName);publicType?TypeOf(string?columnName);}publicinterfaceISqlDialect{DapperDatabaseProviderProviderType{get;}stringDefaultSchema{get;}stringQuoteIdentifier(stringidentifier);stringParameterReference(stringname);stringPagingClause(intoffset,intsize);boolRequiresOrderByForPaging{get;}stringOrderByFallback{get;}stringNullOrdering(SortOrderorder);stringEscapeLikeValue(stringvalue);stringLikeEscapeClause{get;}boolSupportsTableValuedFunctions{get;}boolSupportsStoredProcedures{get;}stringBuildSource(stringschema,stringname,DapperObjectTypetype,IReadOnlyList<string>argumentReferences);stringBuildStoredProcedureCall(stringschema,stringname,IReadOnlyList<KeyValuePair<string,string>>argumentNames);}

See Dapper: Generated SQL and Dapper: Dialects.

Dialects

Namespace PepperX.QueryForge.Dapper.Dialects. All sealed, all parameterless, all stateless.

publicsealedclassSqlServerDialect:ISqlDialect{}publicsealedclassPostgreSqlDialect:ISqlDialect{}publicsealedclassMySqlDialect:ISqlDialect{}publicsealedclassOracleDialect:ISqlDialect{}publicsealedclassSqliteDialect:ISqlDialect{}

PepperX.QueryForge.EFCore

Depends on Microsoft.EntityFrameworkCore 10.0.0.

namespacePepperX.QueryForge.EFCore;publicstaticclassQueryForgeQueryableExtensions{publicstaticTask<QueryResult<TModel>>ToQueryResultAsync<TModel>(thisIQueryable<TModel>source,Queryquery,CancellationTokencancellationToken=default);publicstaticIQueryable<TModel>ApplyQuery<TModel>(thisIQueryable<TModel>source,Queryquery);publicstaticIQueryable<TModel>ApplyFilter<TModel>(thisIQueryable<TModel>source,Queryquery);publicstaticIQueryable<TModel>ApplySort<TModel>(thisIQueryable<TModel>source,Queryquery);publicstaticIQueryable<TModel>ApplyPaging<TModel>(thisIQueryable<TModel>source,Queryquery);publicstaticIQueryable<TModel>ApplyProjection<TModel>(thisIQueryable<TModel>source,Queryquery,IReadOnlyList<string>?alsoKeep=null);}
namespacePepperX.QueryForge.EFCore.Translation;publicstaticclassExpressionCompiler{publicstaticExpression<Func<TModel,bool>>?BuildPredicate<TModel>(QueryCriteriacriteria);publicstaticLambdaExpression?BuildSelector<TModel>(stringcolumnName);publicstaticExpression<Func<TModel,TModel>>?BuildProjection<TModel>(IReadOnlyList<string>selectColumns,IReadOnlyList<string>?alsoKeep=null);publicstaticLambdaExpression?BuildNullRank<TModel>(PropertyInfoproperty,boolnullsFirst);publicstaticExpression<Func<TKey,int>>?BuildKeyNullRank<TKey>(boolnullsFirst);publicstaticPropertyInfo?ResolveProperty<TModel>(string?columnName);}

See EF Core Provider.


PepperX.QueryForge.InMemory

No dependencies beyond the core package.

namespacePepperX.QueryForge.InMemory;publicstaticclassInMemoryQueryExtensions{publicstaticQueryResult<TModel>ToQueryResult<TModel>(thisIEnumerable<TModel>source,Queryquery,Func<TModel,string,object?>?valueAccessor=null);publicstaticTask<QueryResult<TModel>>ToQueryResultAsync<TModel>(thisIEnumerable<TModel>source,Queryquery,Func<TModel,string,object?>?valueAccessor=null,CancellationTokencancellationToken=default);publicstaticIEnumerable<TModel>ApplyQuery<TModel>(thisIEnumerable<TModel>source,Queryquery,Func<TModel,string,object?>?valueAccessor=null);publicstaticIEnumerable<TModel>ApplyFilter<TModel>(thisIEnumerable<TModel>source,Queryquery,Func<TModel,string,object?>?valueAccessor=null);publicstaticIEnumerable<TModel>ApplySort<TModel>(thisIEnumerable<TModel>source,Queryquery,Func<TModel,string,object?>?valueAccessor=null);publicstaticIEnumerable<TModel>ApplyPaging<TModel>(thisIEnumerable<TModel>source,Queryquery);publicstaticIEnumerable<TModel>ApplyProjection<TModel>(thisIEnumerable<TModel>source,Queryquery);}publicstaticclassInMemoryAccessors{publicstaticFunc<TRow,string,object?>ForDictionary<TRow>()whereTRow:IReadOnlyDictionary<string,object?>;publicstaticFunc<TModel,string,object?>WithColumnMap<TModel>(IReadOnlyDictionary<string,string>columnToProperty);}

See In-Memory Provider.


Internal types

These are internal and are listed only so their names are recognisable in a stack trace. They are not part of the public contract and can change without a major version.

TypeRole
DapperRegistryholds one executor per engine; resolves by connection type name
QueryExecutorruns compiled statements and assembles the result
SchemaCachediscovers and caches each object's column whitelist
QueryForgeParametersbinds parameters and forces BindByName where the driver supports it
DapperEngineholds the registry backing the IDbConnection extension
DapperQueryServicethe IDapperQueryService implementation

Test projects have InternalsVisibleTo; applications do not.

Clone this wiki locally