Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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);
        }
Exemple #4
0
        /// <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);
        }