Параметры и пример использования функции FuncEQ

FuncEQ - функция, аналогичная сравнению на равенство в SQL, в построителе функций ограничения SQLWhereLanguageDef.

Параметры GetFunction

Функция GetFunction принимает первым параметром тип функции funcEQ, а дальше принимает 2 объекта на сравнение их между собой. Первым посылается описание переменной (Variable Definition), по которому будут определяться объекты для сравнения; а вторым параметром - объект, с которым будет происходить сравнение.

Исключение составляет тип bool: langdef.GetFunction(langdef.funcEQ, new VariableDef(langdef.BoolType, "SomeBoolFlag")) сработает и без указания второго параметра (по умолчанию будет происходить сравнение с true).

Проверку на null надо проводить при помощи функции FuncIsNull, при попытке проверить что-либо на null с помощью FuncEQ возникнет исключительная ситуация Object reference not set to an instance of an object.

Пример использования

Например, требуется вычитать все Кредиты определенного Клиента.

SQL-выражение выглядело бы следующим образом:

SELECT * FROM Кредит WHERE Клиент = '{ID}'@@
Где {ID} - [Primary-keys-objects|первичный ключ) искомого `Клиента`

Через SQLWhereLanguageDef:

Клиент клиент = new Клиент();
SQLWhereLanguageDef langdef = SQLWhereLanguageDef.LanguageDef;
Function lf = langdef.GetFunction(langdef.funcEQ, new VariableDef(langdef.GuidType, Information.ExtractPropertyPath<Кредит>(x => x.Клиент)), клиент.__PrimaryKey);

Особенности сравнения строк

Дело в том, что MS SQL Sever следует стандарту ANSI SQL-92 в том, что касается сравнения строк.

Чтобы определить, равны ли строки неодинаковой длины, прежде всего с правой стороны более короткой строки добавляются пробелы, так что длины строк становятся равными.

Затем символы в первой строке сравниваются с символами второй с учетом их расположения. Если не равна хотя бы одна пара, строки считаются неравными.

Это касается сравнений типа WHERE strfield = ‘…’, или HAVING strfield=’…’, или strfield IN (‘…’, ‘…’, …). В этих случаях строки ‘abc’ и ‘abc ‘ будут считаться равными.

Исключением является оператор LIKE (WHERE strfield LIKE ‘…’), для него строки ‘abc’ и ‘abc ‘ - различны, поэтому для наложения ограничений на строки следует использовать функцию funcLike.