Exemplo n.º 1
0
 public DefaultDbCommandExpressionBuilder(
     ITypeMappingProvider typeMappingProvider,
     IQueryFormattingProvider queryFormattingProvider)
 {
     this.typeMappingProvider     = typeMappingProvider ?? throw new ArgumentNullException(nameof(typeMappingProvider));
     this.queryFormattingProvider = queryFormattingProvider ?? throw new ArgumentNullException(nameof(queryFormattingProvider));
 }
 public DefaultQueryTranslatingExpressionVisitorFactory(
     ITypeMappingProvider typeMappingProvider,
     IQueryFormattingProvider queryFormattingProvider)
 {
     this.typeMappingProvider     = typeMappingProvider ?? throw new System.ArgumentNullException(nameof(typeMappingProvider));
     this.queryFormattingProvider = queryFormattingProvider ?? throw new System.ArgumentNullException(nameof(queryFormattingProvider));
 }
 public TranslatabilityAnalyzingExpressionVisitor(IQueryFormattingProvider queryFormattingProvider)
 {
     this.queryFormattingProvider = queryFormattingProvider ?? throw new System.ArgumentNullException(nameof(queryFormattingProvider));
 }
Exemplo n.º 4
0
        private static void RuntimeAddDynamicParameters(
            DbCommand dbCommand,
            StringBuilder stringBuilder,
            string fragment,
            Func <IEnumerable> values,
            string name,
            IQueryFormattingProvider queryFormattingProvider,
            DbType?dbType,
            Func <object, object> conversion)
        {
            DbParameter parameter;
            string      formattedName;
            IEnumerator enumerator     = default;
            var         index          = 0;
            var         addedParameter = false;
            var         foundNull      = false;

            try
            {
                enumerator = values().GetEnumerator();

                var insertPoint = stringBuilder.Length;

                stringBuilder.Append(fragment);

                if (enumerator.MoveNext())
                {
                    if (enumerator.Current == null)
                    {
                        foundNull = true;
                    }
                    else
                    {
                        if (!addedParameter)
                        {
                            stringBuilder.Append(" IN (");
                        }

                        addedParameter = true;
                        formattedName  = queryFormattingProvider.FormatParameterName($"{name}_{index++}");
                        stringBuilder.Append(formattedName);
                        parameter = dbCommand.CreateParameter();
                        parameter.ParameterName = formattedName;

                        if (conversion != null)
                        {
                            parameter.Value = conversion(enumerator.Current);
                        }
                        else
                        {
                            parameter.Value = enumerator.Current;
                        }

                        if (dbType.HasValue)
                        {
                            parameter.DbType = dbType.Value;
                        }

                        dbCommand.Parameters.Add(parameter);
                    }

                    while (enumerator.MoveNext())
                    {
                        if (enumerator.Current == null)
                        {
                            foundNull = true;
                        }
                        else
                        {
                            formattedName = queryFormattingProvider.FormatParameterName($"{name}_{index++}");

                            if (!addedParameter)
                            {
                                stringBuilder.Append($" IN ({formattedName}");
                            }
                            else
                            {
                                stringBuilder.Append($", {formattedName}");
                            }

                            addedParameter          = true;
                            parameter               = dbCommand.CreateParameter();
                            parameter.ParameterName = formattedName;

                            if (conversion != null)
                            {
                                parameter.Value = conversion(enumerator.Current);
                            }
                            else
                            {
                                parameter.Value = enumerator.Current;
                            }

                            if (dbType.HasValue)
                            {
                                parameter.DbType = dbType.Value;
                            }

                            dbCommand.Parameters.Add(parameter);
                        }
                    }
                }

                if (!addedParameter)
                {
                    if (!foundNull)
                    {
                        stringBuilder.Append(" IN (NULL)");
                    }
                    else
                    {
                        stringBuilder.Append(" IS NULL");
                    }
                }
                else
                {
                    stringBuilder.Append(")");

                    if (foundNull)
                    {
                        stringBuilder.Insert(insertPoint, "(");
                        stringBuilder.Append(" OR ");
                        stringBuilder.Append(fragment);
                        stringBuilder.Append(" IS NULL");
                        stringBuilder.Append(")");
                    }
                }
            }
            catch (Exception exception)
            {
                throw new InvalidOperationException("Error while applying parameters to the query", exception);
            }
            finally
            {
                if (enumerator is IDisposable disposable)
                {
                    disposable.Dispose();
                }
            }
        }