/// <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)); //Генерим критерий }
/// <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; } }
/// <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; } } }
/// <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); }
/// <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); } } }
/// <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; } }
/// <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)); //Генерим критерий }
/// <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">Критерий 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>()) ) ); } }