Example #1
0
        public static ISimpleDataOrder RecordCopyQuery(string tableName, string primaryKeyFieldName, Clause tempTableClause, Tuple <string, string>[] fieldParameterNameTupleCollection, string[] fieldsToCopy)
        {
            string uniqueAppendage = SafeGuid();
            string sourceAlias     = "source";

            string query = $"MERGE {tableName}\r\nUSING ("
                           + $"\r\nSELECT{string.Join(",", fieldsToCopy.Concat(new[] { primaryKeyFieldName }).Distinct().Select(field => $" \ r \ n   {
                field
            } "))}\r\nFROM {tableName}";

            SimpleDataOrder firstDataOrder =
                tempTableClause
                .Build();

            if (string.IsNullOrEmpty(firstDataOrder.Query) == false)
            {
                query += "\r\nWHERE" + firstDataOrder.Query;
            }
            query += $"\r\n) AS {sourceAlias}\r\nON (1 = 0)\r\nWHEN NOT MATCHED THEN";

            IEnumerable <Tuple <string, string> > insertValues = fieldsToCopy.Select(field => Tuple.Create(field, $"{sourceAlias}.{field}")).Concat(fieldParameterNameTupleCollection);

            query += $"\r\nINSERT ({string.Join(",", insertValues.Select(tuple => $"\r\n    {tuple.Item1}"))}\r\n)\r\nVALUES (\r\n";
            query += string.Join(",", insertValues.Select(tuple => $"\r\n    {tuple.Item2}"));
            query += $"\r\n)\r\nOUTPUT {sourceAlias}.{primaryKeyFieldName} AS OldId, INSERTED.{primaryKeyFieldName} AS NewId;";

            return(new SimpleDataOrder(query, firstDataOrder.Parameters));
        }
Example #2
0
        private static IAliasedDataOrder CreateQuery(string tableName,
                                                     IEnumerable <KeyValuePair <string, object> > columns,
                                                     Clause whereCondition,
                                                     IEnumerable <string> outputParameters,
                                                     Func <IEnumerable <KeyValuePair <string, string> >, string, string> queryProducer,
                                                     IEnumerable <Func <string, IEnumerable <string>, IAliasedDataOrder> > outputClauseFunctions
                                                     )
        {
            var columnArray = columns.ToArray();

            var columnsWithParameterNames = new List <KeyValuePair <string, string> >();
            var parameterNamesWithValue   = new List <KeyValuePair <string, object> >();

            for (int i = 0; i < columnArray.Length; i++)
            {
                KeyValuePair <string, object> pair = columnArray[i];
                string parameterName = Clause.GenerateParameterName();
                columnsWithParameterNames.Add(new KeyValuePair <string, string>(pair.Key, parameterName));
                parameterNamesWithValue.Add(new KeyValuePair <string, object>(parameterName, pair.Value));
            }

            string outputClause = "";
            List <IAliasedDataOrder> outputDataOrders = new List <IAliasedDataOrder>();

            if (outputParameters.Any())
            {
                outputDataOrders.AddRange(outputClauseFunctions.Select(f => f(tableName, outputParameters)));

                if (outputDataOrders.Any())
                {
                    outputClause = "\r\nOUTPUT"
                                   + $"\r\n{string.Join(",\r\n", outputDataOrders.Select(dO => dO.Query))}";
                }
            }

            ISimpleDataOrder whereClause = whereCondition.Build();

            var parameters =
                Get.List <KeyValuePair <string, object> >(list => {
                list.AddRange(parameterNamesWithValue);
                list.AddRange(whereClause.Parameters);
            });

            string query = queryProducer(columnsWithParameterNames, outputClause);

            if (string.IsNullOrEmpty(whereClause.Query) == false)
            {
                query += "\r\nWHERE" + whereClause.Query;
            }

            return(new AliasedDataOrder(GenericQueryProvider.SurroundQueryWithTransaction(query), parameters, outputDataOrders.SelectMany(dO => dO.Aliases)));
        }