示例#1
0
        private void SetContactSchemaUid()
        {
            var manager = UserConnection.GetSchemaManager("EntitySchemaManager");
            var contact = manager.FindItemByName("Contact");

            contactSchemaUId = Column.Parameter(contact.UId);
        }
        private static string ResolveExpressionType(QueryColumnExpression expression,
                                                    Dictionary <string, EntitySchema> tableAliases)
        {
            switch (expression.ExpressionType)
            {
            case QueryColumnExpressionType.SourceColumnAlias:
                return(ResolveSourceColumnAliasType(expression, tableAliases));

            case QueryColumnExpressionType.SubSelect:
                Dictionary <string, EntitySchema> subSelectTableAliases = GetTableSchemas(expression.SubSelect);
                return(ResolveExpressionType(expression.SubSelect.Columns.FirstOrDefault(), subSelectTableAliases));

            case QueryColumnExpressionType.Function:
                return(ResolveFunctionColumnType(expression, tableAliases));

            case QueryColumnExpressionType.Const:
                switch (expression.ConstValue)
                {
                case int _:
                case decimal _:
                case double _:
                    return(NumericType);

                case bool _:
                    return(BooleanType);

                default:
                    return(UnknownType);
                }

            default:
                return(UnknownType);
            }
        }
        /// <summary>
        /// Uppdates current step and set next step to null for finalized campaign.
        /// </summary>
        /// <param name="campaignId">Unique identifier of campaign.</param>
        /// <param name="userConnection">User connection.</param>
        private void SetGoalForCampaignStep(Guid campaignId, UserConnection userConnection)
        {
            Guid goalCampaignStepId = GetFirstCampainStepByType(campaignId, CampaignConsts.GoalCampaignStepTypeId,
                                                                userConnection);
            Guid exitCampaignStepId = GetFirstCampainStepByType(campaignId, CampaignConsts.ExitCampaignStepTypeId,
                                                                userConnection);
            QueryColumnExpression nullParameter =
                Column.Parameter(DBNull.Value, new GuidDataValueType(UserConnection.DataValueTypeManager));
            QueryCase      queryCase      = new QueryCase();
            QueryCondition queryCondition = new QueryCondition(QueryConditionType.Equal)
            {
                LeftExpression = new QueryColumnExpression("CurrentStepId")
            };

            queryCondition.RightExpressions.Add(Column.Parameter(goalCampaignStepId));
            queryCase.AddWhenItem(queryCondition, Column.Parameter(goalCampaignStepId));
            queryCondition = new QueryCondition(QueryConditionType.Equal)
            {
                LeftExpression = new QueryColumnExpression("NextStepId")
            };
            queryCondition.RightExpressions.Add(Column.Parameter(goalCampaignStepId));
            queryCase.AddWhenItem(queryCondition, Column.Parameter(goalCampaignStepId));
            queryCase.ElseExpression = new QueryColumnExpression(Column.Parameter(exitCampaignStepId));
            var update = new Update(userConnection, "CampaignTarget")
                         .Set("CurrentStepId", new QueryColumnExpression(queryCase))
                         .Set("NextStepId", nullParameter)
                         .Where("CampaignId").IsEqual(Column.Parameter(campaignId)) as Update;

            update.Execute();
        }
示例#4
0
        private int LoadData(Select select, Action <DataTable> onChunkLoaded, string selectExpression = null)
        {
            select.CheckArgumentNull("selectQuery");
            onChunkLoaded.CheckArgumentNull("onChunkLoaded");
            int chunkSize       = _config.ChunkSize;
            int maxRecordsCount = _config.MaxRecordsCount;
            int minRecordsCount = _config.MinRecordsCount;
            QueryColumnExpression idExpression = GetSelectIdColumnExpression(select, selectExpression);
            var lastValueParameter             = new QueryParameter("IdLastValue", null);
            var pageableSelectCondition        = new PageableSelectCondition {
                LastValueParameter = lastValueParameter,
                LeftExpression     = idExpression,
                OrderByItem        = new OrderByItem(idExpression, OrderDirectionStrict.Ascending)
            };
            var    options            = new PageableSelectOptions(pageableSelectCondition, chunkSize, PageableSelectDirection.First);
            Select pageableSelect     = select.ToPageable(options);
            bool   hasRecords         = true;
            int    totalRecordsCount  = 0;
            bool   useMaxRecordsLimit = maxRecordsCount > 0;

            using (DBExecutor dbExecutor = _userConnection.EnsureDBConnection(QueryKind.Limited)) {
                while (hasRecords && (!useMaxRecordsLimit || totalRecordsCount < maxRecordsCount))
                {
                    hasRecords = false;
                    using (IDataReader dr = pageableSelect.ExecuteReader(dbExecutor)) {
                        var dataTable = new DataTable();
                        dataTable.Load(dr);
                        int recordsCount = dataTable.Rows.Count;
                        totalRecordsCount += recordsCount;
                        if (totalRecordsCount < minRecordsCount && recordsCount < chunkSize)
                        {
                            throw new NotEnoughDataForTrainingException(
                                      $"There's not enough data for upload. Minimal number: {minRecordsCount}," +
                                      $" Current: {totalRecordsCount}");
                        }
                        if (recordsCount == 0)
                        {
                            continue;
                        }
                        hasRecords = true;
                        if (useMaxRecordsLimit && totalRecordsCount >= maxRecordsCount)
                        {
                            SendNotification("LocalizableStrings.RecordCountExceedsLimitMessage.Value");
                        }
                        DataRow lastRow = dataTable.Rows[recordsCount - 1];
                        string  rowId   = lastRow["Id"]?.ToString();
                        if (string.IsNullOrEmpty(rowId))
                        {
                            throw new Exception("Rowset can't contain a record with empty Id");
                        }
                        onChunkLoaded(dataTable);
                        lastValueParameter.Value = new Guid(rowId);
                        options.Direction        = PageableSelectDirection.Next;
                        AddOrderByItemsConditions(select, options, lastRow);
                        pageableSelect = select.ToPageable(options);
                    }
                }
            }
            return(totalRecordsCount);
        }
        private void SetAccountSchemaUid()
        {
            var manager = UserConnection.GetSchemaManager("EntitySchemaManager");
            var account = manager.FindItemByName("Account");

            accountSchemaUId = Column.Parameter(account.UId);
        }
示例#6
0
        private static string ResolveSourceColumnAliasType(QueryColumnExpression expression,
                                                           Dictionary <string, EntitySchema> tableAliases)
        {
            var schema = FindSchemaOfColumn(expression, tableAliases);

            return(schema == null ? UnknownType : ResolveSourceColumnType(schema, expression.SourceColumnAlias));
        }
        private Select GetChangedTranslationsSelect(List <ISysCultureInfo> sysCulturesInfo)
        {
            Select select =
                new Select(UserConnection)
                .Column(TranslationModifiedOnColumnName)
                .Column(TranslationKeyColumnName)
                .From(TranslationSchemaName);
            QueryColumnExpression isTranslationChangedParameter = Column.Parameter(true);
            bool isConditionAdded = false;

            foreach (ISysCultureInfo sysCultureInfo in sysCulturesInfo)
            {
                string isChangedColumnName = sysCultureInfo.IsChangedColumnName;
                select
                .Column(sysCultureInfo.TranslationColumnName)
                .Column(isChangedColumnName);
                if (isConditionAdded)
                {
                    select.Or(isChangedColumnName).IsEqual(isTranslationChangedParameter);
                }
                else
                {
                    select.Where(isChangedColumnName).IsEqual(isTranslationChangedParameter);
                    isConditionAdded = true;
                }
            }
            return(select);
        }
示例#8
0
 private static void ReplaceFiltersWithPrimaryFieldCondition(Select select, Guid entityId,
                                                             QueryColumnExpression idExpression)
 {
     select.Condition.Clear();
     select.Top(1).Where(idExpression.SourceAlias, idExpression.SourceColumnAlias)
     .IsEqual(Column.Parameter(entityId));
 }
示例#9
0
        private EntitySchemaColumn ResolveSchemaColumn(QueryColumnExpression expression,
                                                       Dictionary <string, EntitySchema> tableAliases)
        {
            switch (expression.ExpressionType)
            {
            case QueryColumnExpressionType.SourceColumnAlias: {
                EntitySchema       schema = FindSchemaOfColumn(expression, tableAliases);
                EntitySchemaColumn column = schema?.Columns.FindByColumnValueName(expression.SourceColumnAlias);
                return(column);
            }

            case QueryColumnExpressionType.SubSelect:
                Dictionary <string, EntitySchema> subSelectTableAliases = GetTableSchemas(expression.SubSelect);
                return(ResolveSchemaColumn(expression.SubSelect.Columns.First(), subSelectTableAliases));

            case QueryColumnExpressionType.Function:
                if (expression.Function is AggregationQueryFunction aggregationFunction)
                {
                    return(ResolveSchemaColumn(aggregationFunction.Expression, tableAliases));
                }
                return(null);

            default:
                return(null);
            }
        }
        /// <summary>
        /// Adds given "DateDiff" column to query columns collection.
        /// </summary>
        /// <param name="select">Source <see cref="Select"/> to add column.</param>
        /// <param name="interval">
        /// Is the part of start date and end date that specifies the type of boundary crossed.
        /// </param>
        /// <param name="startDateExpression">Start date expression.</param>
        /// <param name="endDateExpression">End date expression.</param>
        /// <returns>Modified <paramref name="select"/> with newly added column.</returns>
        public static Select DateDiff(this Select select, DateDiffQueryFunctionInterval interval,
                                      object startDateExpression, object endDateExpression)
        {
            QueryColumnExpression startDate = AsQueryColumnExpression(startDateExpression);
            QueryColumnExpression endDate   = AsQueryColumnExpression(endDateExpression);

            return(AddColumn(select, Func.DateDiff(interval, startDate, endDate)));
        }
示例#11
0
        private IsNullQueryFunction GetLczColumnQueryFunction(string lczTableName, string lczTableColumnName,
                                                              string mainTableName, string mainTableColumnName)
        {
            QueryColumnExpression lczTableColumnExpression  = Column.SourceColumn(lczTableName, lczTableColumnName);
            QueryColumnExpression mainTableColumnExpression = Column.SourceColumn(mainTableName, mainTableColumnName);

            return(Func.IsNull(lczTableColumnExpression, mainTableColumnExpression));
        }
示例#12
0
        private static QueryColumnExpression FindColumnByName(Select select, string queryColumnAlias)
        {
            QueryColumnExpressionCollection columns = select.Columns;
            QueryColumnExpression           column  = columns.FindByAlias(queryColumnAlias) ?? columns.Find(
                expression => expression.SourceColumnAlias == queryColumnAlias && expression.Alias.IsNullOrEmpty());

            return(column);
        }
        public static int IncCampaignRecipietCount(Guid campaignId, int count, UserConnection userConnection)
        {
            var update = new Update(userConnection, "Campaign")
                         .Set("TargetTotal", QueryColumnExpression.Add(new QueryColumnExpression("TargetTotal"),
                                                                       Column.Parameter(count)))
                         .Where("Id").IsEqual(Column.Parameter(campaignId)) as Update;

            return(update.Execute());
        }
示例#14
0
        private void AddIdsFilters(Select select, Guid rootObjectUId, string filterData,
                                   QueryColumnExpression idExpression)
        {
            select.Condition.Clear();
            var subSelect = CreateIdsSelect(filterData, rootObjectUId);

            select.Top(1).Where(idExpression.SourceAlias, idExpression.SourceColumnAlias)
            .IsEqual(Column.SubSelect(subSelect));
        }
示例#15
0
        /// <summary>
        /// ########## ######### CASE ## ######### ########### ##########.
        /// </summary>
        /// <param name="conditionForCaseExpression">########, #############
        /// # ##### ##### ####### WHEN.</param>
        /// <param name="expressionForThenInCase">#########, ####### #####
        /// ######### # ##### THEN.</param>
        /// <param name="expressionForElseInCase">#########, ####### #####
        /// ######### # ##### ELSE.</param>
        /// <returns>######### CASE.</returns>
        private QueryCase GenerateCaseForLicQuery(QueryColumnExpression conditionForCaseExpression,
                                                  QueryColumnExpression expressionForThenInCase, QueryColumnExpression expressionForElseInCase)
        {
            var            queryCase      = new QueryCase();
            QueryCondition queryCondition = CreateQueryCondition(conditionForCaseExpression);

            queryCase.AddWhenItem(queryCondition, expressionForThenInCase);
            queryCase.SetElseExpression(expressionForElseInCase);
            return(queryCase);
        }
示例#16
0
        /// <summary>
        /// ####### ####### ### CASE, # ####### ########### c######## ############
        /// ######### ## ######### #######.
        /// </summary>
        /// <param name="columnExpression">########, ############# # ##### #####
        /// #########.</param>
        /// <returns>####### ######## ######### ######### ## #########
        /// #######.</returns>
        private QueryCondition CreateQueryCondition(QueryColumnExpression columnExpression)
        {
            var queryCondition = new QueryCondition(QueryConditionType.Greater)
            {
                LeftExpression = columnExpression
            };

            queryCondition.IsEqual(Column.Const(1));
            return(queryCondition);
        }
示例#17
0
        private void UpdateOrderProduct(Guid orderId)
        {
            QueryColumnExpression totalAmount =
                (Column.SourceColumn("Quantity") * Column.SourceColumn("PrimaryPrice")).Block() -
                ((Column.SourceColumn("PrimaryPrice") * Column.SourceColumn("DiscountPercent") /
                  Column.Parameter(100)).Block() * Column.SourceColumn("Quantity")).Block();
            Update update = new Update(UserConnection, "OrderProduct").
                            Set("TotalAmount", totalAmount).
                            Where("OrderId").IsEqual(Column.Parameter(orderId)) as Update;

            update.Execute();
        }
示例#18
0
        private static QueryColumnExpression GetColumnByName(Select select, string queryColumnAlias)
        {
            QueryColumnExpression column = FindColumnByName(select, queryColumnAlias);

            if (column == null)
            {
                string message = $"Select expression does not contain column with alias '{queryColumnAlias}'. It must "
                                 + "present as it is used in ORDER BY clause.";
                throw new InvalidTrainSetQueryException(message);
            }
            return(column);
        }
示例#19
0
 private static EntitySchema FindSchemaOfColumn(QueryColumnExpression expression,
                                                Dictionary <string, EntitySchema> tableAliases)
 {
     if (tableAliases.TryGetValue(expression.SourceAlias ?? string.Empty, out EntitySchema schema))
     {
         return(schema);
     }
     if (tableAliases.Count == 1)
     {
         return(tableAliases.Values.First());
     }
     return(null);
 }
示例#20
0
        private QueryColumnExpression GetSelectIdColumnExpression(Select select, string selectExpression = null)
        {
            QueryColumnExpression idExpression = FindColumnByName(select, PrimaryQueryColumnName);

            if (idExpression == null)
            {
                string message = "Select expression doesn't contain {0} column. Expression: {1}";
                throw new InvalidTrainSetQueryException(string.Format(message, PrimaryQueryColumnName,
                                                                      selectExpression ?? select.GetSqlText()));
            }
            idExpression.Alias = PrimaryQueryColumnName;
            return(idExpression);
        }
示例#21
0
 private static void AddOrderByItemsConditions(Select select, PageableSelectOptions options, DataRow lastRow)
 {
     options.OrderByItemsConditions.Clear();
     foreach (OrderByItem orderByItem in select.OrderByItems)
     {
         string queryColumnAlias      = orderByItem.Expression.SourceColumnAlias;
         QueryColumnExpression column = GetColumnByName(select, queryColumnAlias);
         column.Alias = queryColumnAlias;
         object         value            = lastRow[queryColumnAlias];
         QueryParameter orderByParameter = new QueryParameter(queryColumnAlias, value);
         options.AddCondition(column, orderByItem, orderByParameter);
     }
 }
        private PageableSelectOptions GetPageableOptions(ReadingOptions readingOptions)
        {
            var idExpression = new QueryColumnExpression(_portalMessageFileAlias, "Id");

            idExpression.Alias = _portalMessageFileIdAlias;
            var lastValueParameter      = new QueryParameter("IdLastValue", readingOptions.LastValue);
            var pageableSelectCondition = new PageableSelectCondition {
                LastValueParameter = lastValueParameter,
                LeftExpression     = idExpression,
                OrderByItem        = new OrderByItem(idExpression, OrderDirectionStrict.Ascending)
            };

            return(new PageableSelectOptions(pageableSelectCondition, readingOptions.RowCount, PageableSelectDirection.Next));
        }
        /// <summary>
        /// Sets ContactId from active  SysAdminUnit it as ReceiverId column.
        /// </summary>
        /// <param name="select"></param>
        private void SetReceiverIdFromActiveEmployees(Select select)
        {
            const string          receiverColumnAlias = "ReceiverId";
            QueryColumnExpression receiverColumn      = select.Columns.FindByAlias(receiverColumnAlias);

            select.CrossJoin("SysAdminUnit").As("sau");
            int receiverIndex = select.Columns.IndexOf(receiverColumn);

            receiverColumn                = Column.SourceColumn("sau", "ContactId");
            receiverColumn.Alias          = receiverColumnAlias;
            select.Columns[receiverIndex] = receiverColumn;
            select.And("sau", "Active").IsEqual(Column.Parameter(true));
            select.And("sau", "ContactId").Not().IsNull();
            select.And("sau", "ConnectionType").IsNotEqual(Column.Parameter(UserType.SSP));
        }
        private SerializableExpression MapLeftExpression(QueryColumnExpression sourceColumnExpression)
        {
            if (sourceColumnExpression == null)
            {
                return(null);
            }
            var leftExpression = new SerializableExpression();

            leftExpression.ExpressionType = sourceColumnExpression.ExpressionType;
            if (sourceColumnExpression.Function != null)
            {
                leftExpression.Function = MapQueryFunction(sourceColumnExpression.Function);
            }
            leftExpression.SourceColumnAlias = sourceColumnExpression.SourceColumnAlias;
            leftExpression.SourceAlias       = sourceColumnExpression.SourceAlias;
            leftExpression.Alias             = sourceColumnExpression.Alias;
            return(leftExpression);
        }
示例#25
0
        /// <summary>
        /// Updates Email data (audience count, last sending time).
        /// </summary>
        /// <param name="bulkEmailId">Unique Id of Email</param>
        /// <param name="dateIn">Time of Email Sending</param>
        /// <param name="isError">Flag whether error during sending occured</param>
        private void UpdateBulkEmailData(Guid bulkEmailId, DateTime dateIn, bool isError = false)
        {
            var count  = 1;
            var update = new Update(_userConnection, "BulkEmail")
                         .Set("StartDate", Column.Parameter(dateIn))
                         .Set("SendStartDate", Column.Parameter(dateIn))
                         .Set("SendDueDate", Column.Parameter(dateIn))
                         .Set("RecipientCount", QueryColumnExpression.Add(new QueryColumnExpression("RecipientCount"),
                                                                          Column.Parameter(count)));

            if (isError)
            {
                update.Set("CommonErrorCount", QueryColumnExpression.Add(new QueryColumnExpression("CommonErrorCount"),
                                                                         Column.Parameter(count)));
            }
            update.Where("Id").IsEqual(Column.Parameter(bulkEmailId));
            (update as Update).Execute();
        }
示例#26
0
        public static Guid AddProcessEntryPoint(UserConnection userConnection, Guid entitySchemaUId, Guid entityId,
                                                Guid processElementUId)
        {
            if (entitySchemaUId == Guid.Empty || entityId == Guid.Empty)
            {
                return(Guid.Empty);
            }
            Guid          entryPointId              = Guid.NewGuid();
            DataValueType guidDataValueType         = userConnection.DataValueTypeManager.GetInstanceByName("Guid");
            var           idParameter               = new QueryParameter("Id", entryPointId, guidDataValueType);
            var           entitySchemaUIdParameter  = new QueryParameter("EntitySchemaUId", entitySchemaUId, guidDataValueType);
            var           entityIdParameter         = new QueryParameter("EntityId", entityId, guidDataValueType);
            var           processElementIdParameter = new QueryParameter("processElementId", processElementUId,
                                                                         guidDataValueType);
            var currentDateTimeParameter = new QueryParameter("CurrentDateTime", userConnection.CurrentUser
                                                              .GetCurrentDateTime(), "DateTime");
            var currentUserContactIdParameter = new QueryParameter(userConnection.CurrentUser.ContactId);
            var isActiveParameter             = new QueryParameter("isActive", true, "Boolean");
            var entryPointInsert = new Insert(userConnection)
                                   .Into("EntryPoint")
                                   .Set("Id", idParameter)
                                   .Set("CreatedOn", currentDateTimeParameter)
                                   .Set("CreatedById", currentUserContactIdParameter)
                                   .Set("ModifiedOn", currentDateTimeParameter)
                                   .Set("ModifiedById", currentUserContactIdParameter)
                                   .Set("EntitySchemaUId", entitySchemaUIdParameter)
                                   .Set("EntityId", entityIdParameter)
                                   .Set("SysProcessElementDataId", processElementIdParameter)
                                   .Set("IsActive", isActiveParameter);

            entryPointInsert.Execute();
            string entitySchemaName = userConnection.EntitySchemaManager.GetItemByUId(entitySchemaUId).Name;
            QueryColumnExpression columnExpression = Column.SqlText(userConnection.DBEngine
                                                                    .GetBitwiseOperationSqlText("ProcessListeners", BitwiseOperation.Or,
                                                                                                ((int)EntityChangeType.Updated).ToString(CultureInfo.InvariantCulture)));
            var update =
                new Update(userConnection, entitySchemaName)
                .Set("ProcessListeners", columnExpression)
                .Where("Id")
                .IsEqual(entityIdParameter);

            update.Execute();
            return(entryPointId);
        }
示例#27
0
        public static void DeactivateProcessEntryPoint(UserConnection userConnection, Guid entryPointId,
                                                       Guid entitySchemaUId, Guid entityId)
        {
            if (entitySchemaUId == Guid.Empty)
            {
                return;
            }
            DataValueType guidDataValueType        = userConnection.DataValueTypeManager.GetInstanceByName("Guid");
            var           currentDateTimeParameter = new QueryParameter("CurrentDateTime",
                                                                        userConnection.CurrentUser.GetCurrentDateTime(), "DateTime");
            var currentUserContactIdParameter = new QueryParameter("ContactId", userConnection.CurrentUser.ContactId,
                                                                   guidDataValueType);
            var entryPointUpdate = new Update(userConnection, "EntryPoint")
                                   .Set("ModifiedOn", currentDateTimeParameter)
                                   .Set("ModifiedById", currentUserContactIdParameter)
                                   .Set("IsActive", new QueryParameter("isActive", false, "Boolean"))
                                   .Where("Id").IsEqual(new QueryParameter("Id", entryPointId, guidDataValueType));

            entryPointUpdate.Execute();
            string entitySchemaName       = userConnection.EntitySchemaManager.GetItemByUId(entitySchemaUId).Name;
            var    entityIdParameter      = new QueryParameter("EntityId", entityId, guidDataValueType);
            var    processListenersSelect =
                new Select(userConnection)
                .Column("Id")
                .From("SysEntityCommonPrcEl")
                .Where("RecordId").IsEqual(entityIdParameter)
                .And("RecordChangeType").IsEqual(Column.Parameter(EntityChangeType.Updated));
            var select =
                new Select(userConnection)
                .Column("Id")
                .From("EntryPoint")
                .Where("EntityId").IsEqual(entityIdParameter)
                .And("IsActive").IsEqual(Column.Parameter(true))
                .Union(processListenersSelect);
            var columnExpression = new QueryColumnExpression(ArithmeticOperation.Subtraction,
                                                             Column.SourceColumn("ProcessListeners"), Column.Parameter((int)EntityChangeType.Updated));
            var update =
                new Update(userConnection, entitySchemaName)
                .Set("ProcessListeners", columnExpression)
                .Where("Id").IsEqual(entityIdParameter)
                .And().Not().Exists(select);

            update.Execute();
        }
        public int ExcludeFromCampaign(Guid campaignId, Guid[] campaignTargetIds)
        {
            Guid exitFromCampaignId = GetFirstCampainStepByType(campaignId, CampaignConsts.ExitCampaignStepTypeId,
                                                                UserConnection);
            QueryColumnExpression nullParameter =
                Column.Parameter(DBNull.Value, new GuidDataValueType(UserConnection.DataValueTypeManager));

            if (exitFromCampaignId.IsEmpty())
            {
                return(0);
            }
            var excludeQuery = new Update(UserConnection, "CampaignTarget")
                               .Set("NextStepId", nullParameter)
                               .Set("CurrentStepId", Column.Const(exitFromCampaignId))
                               .Where("Id").In(Column.Parameters(campaignTargetIds))
                               .And("CurrentStepId").Not().IsEqual(Column.Const(exitFromCampaignId));

            return(excludeQuery.Execute());
        }
示例#29
0
        private static string ResolveFunctionColumnType(QueryColumnExpression expression,
                                                        Dictionary <string, EntitySchema> tableAliases)
        {
            switch (expression.Function)
            {
            case DateDiffQueryFunction _:
            case DataLengthQueryFunction _:
            case DatePartQueryFunction _:
            case LengthQueryFunction _:
                return(NumericType);

            case CurrentDateTimeQueryFunction _:
            case DateAddQueryFunction _:
                return(DateTimeType);

            case ConcatQueryFunction _:
            case SubstringQueryFunction _:
            case TrimQueryFunction _:
            case UpperQueryFunction _:
                return(TextType);

            case CoalesceQueryFunction coalesce:
                return(ResolveExpressionType(coalesce.Expressions.FirstOrDefault(), tableAliases));

            case AggregationQueryFunction aggregate:
                return(ResolveAggregationFunctionType(aggregate, tableAliases));

            case IsNullQueryFunction isNull:
                var checkExpressionType = ResolveExpressionType(isNull.CheckExpression, tableAliases);
                if (checkExpressionType.IsNullOrEmpty() || checkExpressionType == UnknownType)
                {
                    return(ResolveExpressionType(isNull.ReplacementExpression, tableAliases));
                }
                return(checkExpressionType);

            case CastQueryFunction castFunction
                when _typeMapping.TryGetValue(castFunction.CastType.ValueType, out string typeMapping):
                return(typeMapping);

            default:
                return(UnknownType);
            }
        }
示例#30
0
 private void UpdateConditions(QueryCondition conditions)
 {
     if (conditions.Count > 0)
     {
         foreach (QueryCondition condition in conditions)
         {
             UpdateConditions(condition);
         }
     }
     else
     {
         QueryColumnExpression leftExpression = conditions.LeftExpression;
         if (leftExpression != null)
         {
             SetParameterValueTimeZoneOffset(leftExpression.Parameter);
             var datePartFunction = leftExpression.Function as DatePartQueryFunction;
             if (datePartFunction != null)
             {
                 datePartFunction.UtcOffset = TimeZoneOffset;
             }
         }
         if (conditions.RightExpressions != null)
         {
             foreach (QueryColumnExpression expression in conditions.RightExpressions)
             {
                 SetParameterValueTimeZoneOffset(expression.Parameter);
                 object function = expression.Function;
                 if (function != null)
                 {
                     var expressionProperty = function.GetType().GetProperty("Expression");
                     if (expressionProperty != null)
                     {
                         var functionExpression = (QueryColumnExpression)expressionProperty.GetValue(function, null);
                         if (functionExpression != null)
                         {
                             SetParameterValueTimeZoneOffset(functionExpression.Parameter);
                         }
                     }
                 }
             }
         }
     }
 }