Table of Contents

Class QueryHelper

Namespace
LinqToDB.Internal.SqlQuery
Assembly
linq2db.dll
public static class QueryHelper
Inheritance
QueryHelper
Inherited Members

Methods

CalcCanBeNull(Type?, bool?, ParametersNullabilityType, IEnumerable<bool>)

public static bool CalcCanBeNull(Type? type, bool? canBeNull, ParametersNullabilityType isNullable, IEnumerable<bool> nullInfo)

Parameters

type Type
canBeNull bool?
isNullable ParametersNullabilityType
nullInfo IEnumerable<bool>

Returns

bool

CanBeEvaluated(IQueryElement, EvaluationContext)

public static bool CanBeEvaluated(this IQueryElement expr, EvaluationContext context)

Parameters

expr IQueryElement
context EvaluationContext

Returns

bool

CanBeEvaluated(IQueryElement, bool)

public static bool CanBeEvaluated(this IQueryElement expr, bool withParameters)

Parameters

expr IQueryElement
withParameters bool

Returns

bool

CanBeNullableOrUnknown(ISqlExpression, NullabilityContext, bool)

public static bool CanBeNullableOrUnknown(this ISqlExpression expr, NullabilityContext nullabilityContext, bool withoutUnknownErased)

Parameters

expr ISqlExpression
nullabilityContext NullabilityContext
withoutUnknownErased bool

Returns

bool

CollectDependencies(IQueryElement, IEnumerable<ISqlTableSource>, HashSet<ISqlExpression>, IEnumerable<IQueryElement>?, bool)

public static void CollectDependencies(IQueryElement root, IEnumerable<ISqlTableSource> sources, HashSet<ISqlExpression> found, IEnumerable<IQueryElement>? ignore = null, bool singleColumnLevel = false)

Parameters

root IQueryElement
sources IEnumerable<ISqlTableSource>
found HashSet<ISqlExpression>
ignore IEnumerable<IQueryElement>
singleColumnLevel bool

CollectParametersAndValues(IQueryElement, ICollection<SqlParameter>, ICollection<SqlValue>)

public static void CollectParametersAndValues(IQueryElement root, ICollection<SqlParameter> parameters, ICollection<SqlValue> values)

Parameters

root IQueryElement
parameters ICollection<SqlParameter>
values ICollection<SqlValue>

CollectUniqueKeys(ISqlTableSource, bool, List<IList<ISqlExpression>>)

Collects unique keys from different sources.

public static void CollectUniqueKeys(ISqlTableSource tableSource, bool includeDistinct, List<IList<ISqlExpression>> knownKeys)

Parameters

tableSource ISqlTableSource
includeDistinct bool

Flag to include Distinct as unique key.

knownKeys List<IList<ISqlExpression>>

List with found keys.

CollectUniqueKeys(SqlTableSource, List<IList<ISqlExpression>>)

Collects unique keys from different sources.

public static void CollectUniqueKeys(SqlTableSource tableSource, List<IList<ISqlExpression>> knownKeys)

Parameters

tableSource SqlTableSource
knownKeys List<IList<ISqlExpression>>

List with found keys.

CollectUsedSources(IQueryElement, HashSet<ISqlTableSource>, IEnumerable<IQueryElement>?)

public static void CollectUsedSources(IQueryElement root, HashSet<ISqlTableSource> found, IEnumerable<IQueryElement>? ignore = null)

Parameters

root IQueryElement
found HashSet<ISqlTableSource>
ignore IEnumerable<IQueryElement>

ConcatSearchCondition(SqlHavingClause, SqlSearchCondition)

public static void ConcatSearchCondition(this SqlHavingClause where, SqlSearchCondition search)

Parameters

where SqlHavingClause
search SqlSearchCondition

ConcatSearchCondition(SqlWhereClause, SqlSearchCondition)

public static void ConcatSearchCondition(this SqlWhereClause where, SqlSearchCondition search)

Parameters

where SqlWhereClause
search SqlSearchCondition

ContainsAggregationFunction(IQueryElement)

public static bool ContainsAggregationFunction(IQueryElement expr)

Parameters

expr IQueryElement

Returns

bool

ContainsAggregationOrWindowFunction(IQueryElement)

public static bool ContainsAggregationOrWindowFunction(IQueryElement expr)

Parameters

expr IQueryElement

Returns

bool

ContainsWindowFunction(IQueryElement)

public static bool ContainsWindowFunction(IQueryElement expr)

Parameters

expr IQueryElement

Returns

bool

ConvertFormatToConcatenation(string, IReadOnlyList<ISqlExpression>)

public static ISqlExpression ConvertFormatToConcatenation(string format, IReadOnlyList<ISqlExpression> parameters)

Parameters

format string
parameters IReadOnlyList<ISqlExpression>

Returns

ISqlExpression

CorrectComparisonForJoin(SqlSearchCondition)

Disables null checks for equality operations.

public static SqlSearchCondition CorrectComparisonForJoin(SqlSearchCondition sc)

Parameters

sc SqlSearchCondition

Returns

SqlSearchCondition

CreateSqlValue(object?, DbDataType, params ISqlExpression[])

public static ISqlExpression CreateSqlValue(object? value, DbDataType dbDataType, params ISqlExpression[] basedOn)

Parameters

value object
dbDataType DbDataType
basedOn ISqlExpression[]

Returns

ISqlExpression

CreateSqlValue(object?, SqlBinaryExpression, MappingSchema)

public static ISqlExpression CreateSqlValue(object? value, SqlBinaryExpression be, MappingSchema mappingSchema)

Parameters

value object
be SqlBinaryExpression
mappingSchema MappingSchema

Returns

ISqlExpression

EnsureConjunction(SqlWhereClause)

Ensures that expression is not A OR B but (A OR B) Function makes all needed manipulations for that

public static SqlSearchCondition EnsureConjunction(this SqlWhereClause whereClause)

Parameters

whereClause SqlWhereClause

Returns

SqlSearchCondition

EnumerateAccessibleSources(SelectQuery)

Enumerates table sources recursively based on joins

public static IEnumerable<ISqlTableSource> EnumerateAccessibleSources(SelectQuery selectQuery)

Parameters

selectQuery SelectQuery

Returns

IEnumerable<ISqlTableSource>

EnumerateAccessibleSources(SqlTableSource)

public static IEnumerable<ISqlTableSource> EnumerateAccessibleSources(SqlTableSource tableSource)

Parameters

tableSource SqlTableSource

Returns

IEnumerable<ISqlTableSource>

EnumerateAccessibleTableSources(SelectQuery)

Enumerates table sources recursively based on joins

public static IEnumerable<SqlTableSource> EnumerateAccessibleTableSources(SelectQuery selectQuery)

Parameters

selectQuery SelectQuery

Returns

IEnumerable<SqlTableSource>

EnumerateAccessibleTables(SelectQuery)

public static IEnumerable<SqlTable> EnumerateAccessibleTables(SelectQuery selectQuery)

Parameters

selectQuery SelectQuery

Returns

IEnumerable<SqlTable>

EnumerateJoins(SelectQuery)

public static IEnumerable<SqlJoinedTable> EnumerateJoins(SelectQuery selectQuery)

Parameters

selectQuery SelectQuery

Returns

IEnumerable<SqlJoinedTable>

EnumerateLevelSources(SelectQuery)

public static IEnumerable<SqlTableSource> EnumerateLevelSources(SelectQuery selectQuery)

Parameters

selectQuery SelectQuery

Returns

IEnumerable<SqlTableSource>

EvaluateBoolExpression(IQueryElement, EvaluationContext, bool?)

public static bool? EvaluateBoolExpression(this IQueryElement expr, EvaluationContext context, bool? defaultValue = null)

Parameters

expr IQueryElement
context EvaluationContext
defaultValue bool?

Returns

bool?

EvaluateExpression(IQueryElement, EvaluationContext)

public static object? EvaluateExpression(this IQueryElement expr, EvaluationContext context)

Parameters

expr IQueryElement
context EvaluationContext

Returns

object

ExtractField(ISqlExpression)

Returns SqlField from specific expression. Usually from SqlColumn. Conversion is ignored.

public static SqlField? ExtractField(ISqlExpression expression)

Parameters

expression ISqlExpression

Returns

SqlField

Field instance associated with expression

ExtractPredicate(ISqlPredicate, out ISqlPredicate, out bool)

public static void ExtractPredicate(ISqlPredicate predicate, out ISqlPredicate underlying, out bool isNot)

Parameters

predicate ISqlPredicate
underlying ISqlPredicate
isNot bool

ExtractSqlTable(ISqlExpression?)

Returns SqlTable from specific expression. Usually from SqlColumn. Conversion is ignored.

public static SqlTable? ExtractSqlTable(ISqlExpression? expression)

Parameters

expression ISqlExpression

Returns

SqlTable

SqlTable instance associated with expression

GetBoolValue(IQueryElement, EvaluationContext)

public static bool? GetBoolValue(IQueryElement element, EvaluationContext evaluationContext)

Parameters

element IQueryElement
evaluationContext EvaluationContext

Returns

bool?

GetColumnDescriptor(ISqlExpression?)

Returns ColumnDescriptor for expr.

public static ColumnDescriptor? GetColumnDescriptor(ISqlExpression? expr)

Parameters

expr ISqlExpression

Tested SQL Expression.

Returns

ColumnDescriptor

Associated column descriptor or null.

GetDbDataType(ISqlExpression, MappingSchema)

public static DbDataType GetDbDataType(ISqlExpression expr, MappingSchema mappingSchema)

Parameters

expr ISqlExpression
mappingSchema MappingSchema

Returns

DbDataType

GetDbDataTypeWithoutSchema(ISqlExpression)

public static DbDataType GetDbDataTypeWithoutSchema(ISqlExpression expr)

Parameters

expr ISqlExpression

Returns

DbDataType

GetParameterValue(SqlParameter, IReadOnlyParameterValues?)

public static SqlParameterValue GetParameterValue(this SqlParameter parameter, IReadOnlyParameterValues? parameterValues)

Parameters

parameter SqlParameter
parameterValues IReadOnlyParameterValues

Returns

SqlParameterValue

GetUnderlyingField(ISqlExpression)

Returns SqlField from specific expression. Usually from SqlColumn. Complex expressions ignored.

public static SqlField? GetUnderlyingField(ISqlExpression expression)

Parameters

expression ISqlExpression

Returns

SqlField

Field instance associated with expression

GetUsedSources(ISqlExpression, HashSet<ISqlTableSource>)

Retrieves which sources are used in the rootexpression

public static void GetUsedSources(ISqlExpression root, HashSet<ISqlTableSource> foundSources)

Parameters

root ISqlExpression

Expression to analyze.

foundSources HashSet<ISqlTableSource>

Output container for detected sources/

GetValueConverter(ISqlExpression?)

Returns IValueConverter for expr.

public static IValueConverter? GetValueConverter(ISqlExpression? expr)

Parameters

expr ISqlExpression

Tested SQL Expression.

Returns

IValueConverter

Associated converter or null.

HasCteClauseReference(IQueryElement, CteClause?)

public static bool HasCteClauseReference(IQueryElement element, CteClause? clause)

Parameters

element IQueryElement
clause CteClause

Returns

bool

HasElement(IQueryElement, IQueryElement)

public static bool HasElement(this IQueryElement root, IQueryElement element)

Parameters

root IQueryElement
element IQueryElement

Returns

bool

HasParameter(IQueryElement)

public static bool HasParameter(this IQueryElement root)

Parameters

root IQueryElement

Returns

bool

HasQueryParameter(IQueryElement)

public static bool HasQueryParameter(this IQueryElement root)

Parameters

root IQueryElement

Returns

bool

HasTableInQuery(SelectQuery, SqlTable)

public static bool HasTableInQuery(SelectQuery query, SqlTable table)

Parameters

query SelectQuery
table SqlTable

Returns

bool

IsAggregationFunction(IQueryElement)

public static bool IsAggregationFunction(IQueryElement expr)

Parameters

expr IQueryElement

Returns

bool

IsAggregationOrWindowFunction(IQueryElement)

public static bool IsAggregationOrWindowFunction(IQueryElement expr)

Parameters

expr IQueryElement

Returns

bool

IsAggregationQuery(SelectQuery)

public static bool IsAggregationQuery(SelectQuery selectQuery)

Parameters

selectQuery SelectQuery

Returns

bool

IsAggregationQuery(SelectQuery, out bool)

public static bool IsAggregationQuery(SelectQuery selectQuery, out bool needsOrderBy)

Parameters

selectQuery SelectQuery
needsOrderBy bool

Returns

bool

IsBoolean(ISqlExpression, bool)

Returns true if expression typed by predicate (returns SQL BOOLEAN-typed value).

public static bool IsBoolean(ISqlExpression expr, bool includeFields = false)

Parameters

expr ISqlExpression
includeFields bool

Returns

bool

IsConstant(ISqlExpression)

Returns true if tested expression is constant during query execution (e.g. value or parameter).

public static bool IsConstant(ISqlExpression expr)

Parameters

expr ISqlExpression

Tested expression.

Returns

bool

IsConstantFast(ISqlExpression)

public static bool IsConstantFast(ISqlExpression expr)

Parameters

expr ISqlExpression

Returns

bool

IsDependsOn(IQueryElement, IQueryElement, HashSet<IQueryElement>?)

public static bool IsDependsOn(IQueryElement testedRoot, IQueryElement onElement, HashSet<IQueryElement>? elementsToIgnore = null)

Parameters

testedRoot IQueryElement
onElement IQueryElement
elementsToIgnore HashSet<IQueryElement>

Returns

bool

IsDependsOnOuterSources(IQueryElement, IReadOnlyCollection<IQueryElement>?, IReadOnlyCollection<ISqlTableSource>?)

public static bool IsDependsOnOuterSources(IQueryElement testedRoot, IReadOnlyCollection<IQueryElement>? elementsToIgnore = null, IReadOnlyCollection<ISqlTableSource>? currentSources = null)

Parameters

testedRoot IQueryElement
elementsToIgnore IReadOnlyCollection<IQueryElement>
currentSources IReadOnlyCollection<ISqlTableSource>

Returns

bool

IsDependsOnSource(IQueryElement, ISqlTableSource, IReadOnlyCollection<IQueryElement>?)

public static bool IsDependsOnSource(IQueryElement testedRoot, ISqlTableSource onSource, IReadOnlyCollection<IQueryElement>? elementsToIgnore = null)

Parameters

testedRoot IQueryElement
onSource ISqlTableSource
elementsToIgnore IReadOnlyCollection<IQueryElement>

Returns

bool

IsDependsOnSources(IQueryElement, IReadOnlyCollection<ISqlTableSource>, IReadOnlyCollection<IQueryElement>?)

public static bool IsDependsOnSources(IQueryElement testedRoot, IReadOnlyCollection<ISqlTableSource> onSources, IReadOnlyCollection<IQueryElement>? elementsToIgnore = null)

Parameters

testedRoot IQueryElement
onSources IReadOnlyCollection<ISqlTableSource>
elementsToIgnore IReadOnlyCollection<IQueryElement>

Returns

bool

IsEqualTables(SqlTable?, SqlTable?, bool)

public static bool IsEqualTables(SqlTable? table1, SqlTable? table2, bool withExtensions = true)

Parameters

table1 SqlTable
table2 SqlTable
withExtensions bool

Returns

bool

IsMutable(IQueryElement)

public static bool IsMutable(this IQueryElement expr)

Parameters

expr IQueryElement

Returns

bool

IsNullValue(ISqlExpression)

public static bool IsNullValue(this ISqlExpression expr)

Parameters

expr ISqlExpression

Returns

bool

IsPredicate(ISqlExpression)

public static bool IsPredicate(this ISqlExpression expr)

Parameters

expr ISqlExpression

Returns

bool

IsSingleTableInQuery(SelectQuery, SqlTable)

public static bool IsSingleTableInQuery(SelectQuery query, SqlTable table)

Parameters

query SelectQuery
table SqlTable

Returns

bool

IsWindowFunction(IQueryElement)

public static bool IsWindowFunction(IQueryElement expr)

Parameters

expr IQueryElement

Returns

bool

MarkAsNonQueryParameters(IQueryElement)

public static void MarkAsNonQueryParameters(IQueryElement root)

Parameters

root IQueryElement

MoveOrderByUp(params SelectQuery[])

Helper function for moving Ordering up in select tree.

public static void MoveOrderByUp(params SelectQuery[] queries)

Parameters

queries SelectQuery[]

Array of queries

NeedParameterInlining(ISqlExpression)

public static bool NeedParameterInlining(ISqlExpression expression)

Parameters

expression ISqlExpression

Returns

bool

SameWithoutNullablity(ISqlExpression, ISqlExpression)

public static bool SameWithoutNullablity(ISqlExpression expr1, ISqlExpression expr2)

Parameters

expr1 ISqlExpression
expr2 ISqlExpression

Returns

bool

ShouldCheckForNull(ISqlExpression, NullabilityContext)

public static bool ShouldCheckForNull(this ISqlExpression expr, NullabilityContext nullability)

Parameters

expr ISqlExpression
nullability NullabilityContext

Returns

bool

SimplifyColumnExpression(ISqlExpression?)

public static ISqlExpression? SimplifyColumnExpression(ISqlExpression? sqlExpression)

Parameters

sqlExpression ISqlExpression

Returns

ISqlExpression

SuggestDbDataType(ISqlExpression)

public static DbDataType? SuggestDbDataType(ISqlExpression expr)

Parameters

expr ISqlExpression

Returns

DbDataType?

SuggestTableSourceAlias(SelectQuery, string)

public static string SuggestTableSourceAlias(SelectQuery selectQuery, string alias)

Parameters

selectQuery SelectQuery
alias string

Returns

string

TransformExpressionIndexes<TContext>(TContext, string, Func<TContext, int, int>)

public static string TransformExpressionIndexes<TContext>(TContext context, string expression, Func<TContext, int, int> transformFunc)

Parameters

context TContext
expression string
transformFunc Func<TContext, int, int>

Returns

string

Type Parameters

TContext

TryEvaluateExpression(IQueryElement, EvaluationContext, out object?)

public static bool TryEvaluateExpression(this IQueryElement expr, EvaluationContext context, out object? result)

Parameters

expr IQueryElement
context EvaluationContext
result object

Returns

bool

TryEvaluateExpressionForServer(IQueryElement, EvaluationContext, out object?)

public static bool TryEvaluateExpressionForServer(this IQueryElement expr, EvaluationContext context, out object? result)

Parameters

expr IQueryElement
context EvaluationContext
result object

Returns

bool

UnwrapCast(ISqlExpression)

public static ISqlExpression UnwrapCast(ISqlExpression expr)

Parameters

expr ISqlExpression

Returns

ISqlExpression

UnwrapExpression(ISqlExpression, bool)

public static ISqlExpression UnwrapExpression(ISqlExpression expr, bool checkNullability)

Parameters

expr ISqlExpression
checkNullability bool

Returns

ISqlExpression

UnwrapNullablity(ISqlExpression)

public static ISqlExpression UnwrapNullablity(ISqlExpression expr)

Parameters

expr ISqlExpression

Returns

ISqlExpression

WrapQuery<TStatement>(TStatement, SelectQuery, bool, bool)

Wraps queryToWrap by another select. Keeps columns count the same. After modification statement is equivalent symantically.

--before
SELECT c1, c2
FROM A
-- after
SELECT B.c1, B.c2
FROM (
  SELECT c1, c2
  FROM A
     ) B
public static TStatement WrapQuery<TStatement>(TStatement statement, SelectQuery queryToWrap, bool allowMutation, bool doNotRemove = false) where TStatement : SqlStatement

Parameters

statement TStatement

Statement which may contain tested query

queryToWrap SelectQuery

Tells which select query needs enveloping

allowMutation bool

Wrapped query can be not recreated for performance considerations.

doNotRemove bool

Returns

TStatement

The same statement or modified statement when wrapping has been performed.

Type Parameters

TStatement

WrapQuery<TStatement, TContext>(TContext, TStatement, Func<TContext, SelectQuery, IQueryElement?, bool>, Action<TContext, SelectQuery, SelectQuery>?, bool, bool)

Wraps queries by another select. Keeps columns count the same. After modification statement is equivalent symantically.

public static TStatement WrapQuery<TStatement, TContext>(TContext context, TStatement statement, Func<TContext, SelectQuery, IQueryElement?, bool> wrapTest, Action<TContext, SelectQuery, SelectQuery>? onWrap, bool allowMutation, bool doNotRemove = false) where TStatement : SqlStatement

Parameters

context TContext

onWrap and wrapTest context object.

statement TStatement
wrapTest Func<TContext, SelectQuery, IQueryElement, bool>

Delegate for testing when query needs to be wrapped.

onWrap Action<TContext, SelectQuery, SelectQuery>

After enveloping query this function called for prcess needed optimizations.

allowMutation bool

Wrapped query can be not recreated for performance considerations.

doNotRemove bool

Returns

TStatement

The same statement or modified statement when wrapping has been performed.

Type Parameters

TStatement
TContext

Type of onWrap and wrapTest context object.

WrapQuery<TStatement, TContext>(TContext, TStatement, Func<TContext, SelectQuery, IQueryElement?, int>, Action<TContext, IReadOnlyList<SelectQuery>>, bool, bool)

Wraps tested query in subquery(s). Keeps columns count the same. After modification statement is equivalent semantically.

--before
SELECT c1, c2           -- QA
FROM A
-- after (with 2 subqueries)
SELECT C.c1, C.c2       -- QC
FROM (
  SELECT B.c1, B.c2     -- QB
  FROM (
    SELECT c1, c2       -- QA
    FROM A
       ) B
  FROM
     ) C
public static TStatement WrapQuery<TStatement, TContext>(TContext context, TStatement statement, Func<TContext, SelectQuery, IQueryElement?, int> wrapTest, Action<TContext, IReadOnlyList<SelectQuery>> onWrap, bool allowMutation, bool doNotRemove = false) where TStatement : SqlStatement

Parameters

context TContext

onWrap and wrapTest context object.

statement TStatement

Statement which may contain tested query

wrapTest Func<TContext, SelectQuery, IQueryElement, int>

Delegate for testing which query needs to be enveloped. Result of delegate call tells how many subqueries needed. 0 - no changes 1 - one subquery N - N subqueries

onWrap Action<TContext, IReadOnlyList<SelectQuery>>

After wrapping query this function called for prcess needed optimizations. Array of queries contains [QC, QB, QA]

allowMutation bool

Wrapped query can be not recreated for performance considerations.

doNotRemove bool

Returns

TStatement

The same statement or modified statement when wrapping has been performed.

Type Parameters

TStatement
TContext

Type of onWrap and wrapTest context object.