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)); }
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(); } } }