/// <summary> /// Компиляция выражения в ICriterion NHibernate /// </summary> /// <returns></returns> global::NHibernate.Criterion.ICriterion IExpression.Compile(ref ICriteria iCriteria, string alias) { global::NHibernate.Criterion.ICriterion result = null; if (expressions.Count > 0) { string path; //Получаем поле if (createExpression != null) { path = ParseExpression(createExpression.Body); } else { path = propertyName; } string subAlias = ""; //Создаем Restriction на родительское поле и присваиваем ему псевдоним, по которому будем обращаться к дочерним полям ICriteria criteria; var critByPath = iCriteria.GetCriteriaByPath(path); //Пытаемся получить критерий для свойства if (critByPath == null) //Получен ли критерий? { //Нет subAlias = "alias_" + Guid.NewGuid().ToString().Replace("-", ""); //создаем псевдоним criteria = iCriteria.CreateCriteria(path, subAlias); //Создаем вложенный критерий } else { //Да subAlias = critByPath.Alias; //Получаем пседноним criteria = critByPath; //Сохраняем критерий } //Генерация условия result = expressions[0].Compile(ref criteria, subAlias); } return(result); }
/// <summary> /// Компиляция выражения в ICriterion NHibernate /// </summary> /// <returns></returns> global::NHibernate.Criterion.ICriterion IExpression.Compile(ref ICriteria iCriteria, string alias) { global::NHibernate.Criterion.ICriterion left, right, result = null; left = leftExpression.Compile(ref iCriteria, ""); right = rightExpression.Compile(ref iCriteria, ""); switch (condExpression) { case CondJoinExpression.Or: result = global::NHibernate.Criterion.Expression.Or(left, right); break; case CondJoinExpression.And: result = global::NHibernate.Criterion.Expression.And(left, right); break; } return(result); }
/// <summary> /// Генерирование критерия /// </summary> /// <param name="iCriteria">Критерий NHibernate</param> void ISubExpression.Compile(ref global::NHibernate.Criterion.DetachedCriteria iCriteria) { string result; if (likeExpression != null) { //Поле задано лямбда выражением result = ParseExpression(likeExpression.Body); if (result.Length == 0) { throw new Exception("Необходимо указать поле для операции LikeOr."); } if (valueTemplates == null || valueTemplates.Count == 0) { throw new Exception("Необходимо указать строки для поиска."); } } else { //Поле задано именем result = fieldName; } //Генерим критерий global::NHibernate.Criterion.ICriterion expr = null; foreach (var valueTemplate in valueTemplates) { if (expr == null) { expr = global::NHibernate.Criterion.Expression.Like(result, valueTemplate, global::NHibernate.Criterion.MatchMode.Exact); } else { var expression = global::NHibernate.Criterion.Expression.Like(result, valueTemplate, global::NHibernate.Criterion.MatchMode.Exact); expr = global::NHibernate.Criterion.Expression.Or(expr, expression); } } iCriteria.Add(expr); }
/// <summary> /// Генерация ограничения по данным поля /// </summary> /// <param name="iCriteria"></param> private object CompileSimpleRestriction(string alias) { Type fieldType = GetTypeField(fieldName, typeof(T)); //Получаем тип поля object value; string field = "", secondField = ""; if (fieldType != Type.Missing as Type) // Проверяем, найдено ли поле { //Да, найдено value = ConvertToType(fieldValue, fieldType); //Приводим значение field = (String.IsNullOrEmpty(alias) ? "" : alias + '.') + fieldName; // формируем название поля, добавляя псевдоним } else { //Нет, не найдено value = fieldValue; //Используем значение "как есть" field = fieldName; //Оставляем название поля "как есть", т.к. оно предположительно содержит псевдоним } if (value == null && !string.IsNullOrEmpty(secondFieldName)) { var secondFieldType = GetTypeField(secondFieldName, typeof(T)); //Получаем тип поля if (secondFieldType != Type.Missing as Type) // Проверяем, найдено ли поле { //Да, найдено secondField = (String.IsNullOrEmpty(alias) ? "" : alias + '.') + secondFieldName; // формируем название поля, добавляя псевдоним } else { //Нет, не найдено secondField = secondFieldName; //Оставляем название поля "как есть", т.к. оно предположительно содержит псевдоним } } global::NHibernate.Criterion.ICriterion exp = null; switch (fieldCond) { case CriteriaCond.Eq: if (value != null) { exp = global::NHibernate.Criterion.Expression.Eq(field, value); } else if (String.IsNullOrEmpty(secondFieldName)) { exp = global::NHibernate.Criterion.Expression.IsNull(field); } else { exp = global::NHibernate.Criterion.Expression.EqProperty(field, secondField); } break; case CriteriaCond.NotEq: if (value != null) { exp = global::NHibernate.Criterion.Expression.Not(global::NHibernate.Criterion.Expression.Eq(field, value)); } else if (String.IsNullOrEmpty(secondFieldName)) { exp = global::NHibernate.Criterion.Expression.IsNotNull(field); } else { exp = global::NHibernate.Criterion.Expression.NotEqProperty(field, secondField); } break; case CriteriaCond.Gt: if (value != null) { exp = global::NHibernate.Criterion.Expression.Gt(field, value); } else { return(true); } break; case CriteriaCond.Ge: if (value != null) { exp = global::NHibernate.Criterion.Expression.Ge(field, value); } else { return(true); } break; case CriteriaCond.Lt: if (value != null) { exp = global::NHibernate.Criterion.Expression.Lt(field, value); } else { return(true); } break; case CriteriaCond.Le: if (value != null) { exp = global::NHibernate.Criterion.Expression.Le(field, value); } else { return(true); } break; } return(exp); }