예제 #1
0
        /// <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("Необходимо указать поле для операции Like.");
                }
                if (String.IsNullOrEmpty(valueTemplate) || valueTemplate.Length == 0)
                {
                    throw new Exception("Необходимо указать строку для поиска.");
                }
            }
            else
            {
                //Поле задано именем
                result = fieldName;
            }

            iCriteria.Add(global::NHibernate.Criterion.Expression.Like(result, valueTemplate, global::NHibernate.Criterion.MatchMode.Anywhere)); //Генерим критерий
        }
예제 #2
0
        /// <summary>
        /// Генерирование критерия
        /// </summary>
        /// <param name="iCriteria">Критерий NHibernate</param>
        void IExpression.Compile(ref global::NHibernate.ICriteria iCriteria)
        {
            string propName = "";

            global::NHibernate.Criterion.DetachedCriteria dCrit = null;


            propName = joinExpression != null?ParseExpression(joinExpression.Body) : joinProperty;

            if (propName.Length == 0)
            {
                throw new Exception("Необходимо указать поле.");
            }
            if (subCriteria == null)
            {
                throw new Exception("Необходимо указать подзапрос.");
            }

            dCrit = GetSubCriteria(subCriteria);    //Получаем критерий подзапроса NHibernate

            switch (joinType)
            {
            case JoinExpressionType.In:
                iCriteria.Add(global::NHibernate.Criterion.Subqueries.PropertyIn(propName, dCrit));
                break;

            case JoinExpressionType.NotIn:
                iCriteria.Add(global::NHibernate.Criterion.Subqueries.PropertyNotIn(propName, dCrit));
                break;
            }
        }
예제 #3
0
        /// <summary>
        /// Компилирование выражения под ORM
        /// </summary>
        /// <param name="iCriteria"></param>
        /// <returns></returns>
        void ISubExpression.Compile(ref global::NHibernate.Criterion.DetachedCriteria iCriteria)
        {
            object result;

            if (restrictionExpression != null)
            {
                // Ограничение задано лямбда выражением
                result = CompileRestrictionFromLambda();
            }
            else
            {
                //Ограничение задано именем поля и значением
                result = CompileSimpleRestriction(String.Empty);
            }

            //Обрабатываем результат
            if (!(result is bool))
            {
                iCriteria.Add(result as global::NHibernate.Criterion.ICriterion);
            }
            else
            {
                if (!Convert.ToBoolean(result))
                {
                    iCriteria = null;
                }
            }
        }
예제 #4
0
        /// <summary>
        /// Компиляция выражения в ICriterion NHibernate
        /// </summary>
        /// <returns></returns>
        global::NHibernate.Criterion.ICriterion IExpression.Compile(ref global::NHibernate.ICriteria iCriteria, string alias)
        {
            string propName = "";

            global::NHibernate.Criterion.DetachedCriteria dCrit = null;

            propName = joinExpression != null?ParseExpression(joinExpression.Body) : (String.IsNullOrEmpty(alias) ? "" : alias + '.') + joinProperty;

            if (propName.Length == 0)
            {
                throw new Exception("Необходимо указать поле.");
            }
            if (subCriteria == null)
            {
                throw new Exception("Необходимо указать подзапрос.");
            }

            dCrit = GetSubCriteria(subCriteria);    //Получаем критерий подзапроса NHibernate

            switch (joinType)
            {
            case JoinExpressionType.In:
                return(global::NHibernate.Criterion.Subqueries.PropertyIn(propName, dCrit));

            case JoinExpressionType.NotIn:
                return(global::NHibernate.Criterion.Subqueries.PropertyNotIn(propName, dCrit));
            }

            return(null);
        }
예제 #5
0
        /// <summary>
        /// Генерация запроса
        /// </summary>
        /// <param name="obj">Критерий NHibernate</param>
        /// <returns></returns>
        public void Compile(ref global::NHibernate.Criterion.DetachedCriteria iCriteria)
        {
            var path = ParseExpression(createExpression.Body);   //Получаем поле

            var critForPath = iCriteria.GetCriteriaByPath(path); //Ищем критерий для пути

            string subAlias;

            global::NHibernate.Criterion.DetachedCriteria crit;

            if (critForPath == null)
            {
                subAlias = "alias_" + Guid.NewGuid().ToString().Replace("-", ""); //Создаем псевдоним для вложенного критерия
                crit     = iCriteria.CreateCriteria(path, subAlias);              //Создаем вложенный критерий
            }
            else
            {
                subAlias = critForPath.Alias;   //используем имеющийся псевдоним
                crit     = critForPath;
            }

            if (expressions.Count > 0)
            {
                //Цикл генерации вложенных критериев
                foreach (var expr in expressions)
                {
                    expr.Compile(ref crit);
                    if (crit == null)
                    {
                        iCriteria = null;

                        return;
                    }
                }
            }

            if (crit != null)
            {
                //генерация проекций
                if (projectionFields.Count == 1)    //Одна
                {
                    var fieldName = ParseExpression(projectionFields[0].Body);
                    iCriteria.SetProjection(global::NHibernate.Criterion.Projections.Property(subAlias + "." + fieldName));
                }
                else if (projectionFields.Count > 1) //Много
                {
                    var obj = global::NHibernate.Criterion.Projections.ProjectionList();
                    foreach (var expr in projectionFields)
                    {
                        var fieldName = ParseExpression(projectionFields[0].Body);
                        obj.Add(global::NHibernate.Criterion.Projections.Property(subAlias + "." + fieldName));
                    }
                    iCriteria.SetProjection(obj);
                }
            }
        }
예제 #6
0
        /// <summary>
        /// Генерирование критерия
        /// </summary>
        /// <param name="iCriteria">Критерий NHibernate</param>
        void ISubExpression.Compile(ref global::NHibernate.Criterion.DetachedCriteria iCriteria)
        {
            global::NHibernate.Criterion.ICriterion left, right;
            ICriteria iCrit = null;

            left  = leftExpression.Compile(ref iCrit, "");
            right = rightExpression.Compile(ref iCrit, "");

            switch (condExpression)
            {
            case CondJoinExpression.Or:
                iCriteria.Add(global::NHibernate.Criterion.Expression.Or(left, right));
                break;

            case CondJoinExpression.And:
                iCriteria.Add(global::NHibernate.Criterion.Expression.And(left, right));
                break;
            }
        }
예제 #7
0
        /// <summary>
        /// Генерирование критерия
        /// </summary>
        /// <param name="iCriteria"></param>
        void ISubExpression.Compile(ref global::NHibernate.Criterion.DetachedCriteria iCriteria)
        {
            string result;

            if (sortByExpression != null)
            {
                //Поле сортировки задано лямбдой
                result = ParseExpression(sortByExpression.Body);
                if (result.Length == 0)
                {
                    throw new Exception("Необходимо указать поле для сортировки.");
                }
            }
            else
            {
                //Поле задано именем
                result = fieldName;
            }

            iCriteria.AddOrder(new global::NHibernate.Criterion.Order(result, sortByAsc));  //Генерим критерий
        }
예제 #8
0
        /// <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);
        }
예제 #9
0
        /// <summary>
        /// Генерирование критерия
        /// </summary>
        /// <param name="iCriteria">Критерий NHibernate</param>
        void ISubExpression.Compile(ref global::NHibernate.Criterion.DetachedCriteria iCriteria)
        {
            string result;

            if (propertyExpression != null)
            {
                result = ParseExpression(propertyExpression.Body);
            }
            else
            {
                result = fieldName;
            }

            Type type = GetTypeField(result, typeof(T));     //Получаем тип данных поля

            List <object> objs = new List <object>();

            foreach (var value in values)
            {
                objs.Add(ConvertToType(value, type));
            }

            if (!inverseCondition)
            {
                iCriteria.Add(global::NHibernate.Criterion.Expression.In(result, objs.ToArray <object>()));
            }
            else
            {
                iCriteria.Add
                (
                    global::NHibernate.Criterion.Expression.Not
                    (
                        global::NHibernate.Criterion.Expression.In(result, objs.ToArray <object>())
                    )
                );
            }
        }