FuncIN
- функция, аналогичная сравнению на равенство в SQL, в построителе функций ограничения SQLWhereLanguageDef.
Параметры GetFunction
Функция GetFunction принимает один параметр: массив, состоящий из определения переменной (Variable Def) и объектов, среди которых будет производиться поиск.
Пример использования
Рассмотрим пример. Требуется вычитать все Кредиты
, выданные особым клиентам, список ключей которых нам известен.
SQL-выражение выглядело бы следующим образом:
SELECT * FROM Кредиты WHERE Клиент IN ('{IDList}')@@
Где {IDList} - список [Primary-keys-objects|первичных ключей) искомых `Клиентов`
Через SQLWhereLanguageDef:
List<Клиент> клиенты = new List<Клиент>();
SQLWhereLanguageDef langdef = SQLWhereLanguageDef.LanguageDef;
List<object> clientKeys = new List<object>();
clientKeys.Add(new VariableDef(langdef.GuidType, Information.ExtractPropertyPath<Кредит>(x => x.Клиент)));
foreach (var клиент in клиенты)
clientKeys.Add(клиент.__PrimaryKey);
Function lf = langdef.GetFunction(langdef.funcIN, clientKeys.ToArray());
Особенности сравнения строк
Дело в том, что MS SQL Sever следует стандарту ANSI SQL-92 в том, что касается сравнения строк.
Чтобы определить, равны ли строки неодинаковой длины, прежде всего с правой стороны более короткой строки добавляются пробелы, так что длины строк становятся равными.
Затем символы в первой строке сравниваются с символами второй с учетом их расположения. Если не равна хотя бы одна пара, строки считаются неравными.
Это касается сравнений типа WHERE strfield = ‘…’, или HAVING strfield=’…’, или strfield IN (‘…’, ‘…’, …). В этих случаях строки ‘abc’ и ‘abc ‘ будут считаться равными.
Исключением является оператор LIKE
(WHERE strfield LIKE ‘…’), для него строки ‘abc’ и ‘abc ‘ - различны, поэтому для наложения ограничений на строки, вместо FuncIN
следует использовать сочетание функций FuncOR, FuncLike.