NHibernate C # - Увеличить количество параметров [дубликат]

Здесь вы идете. Как говорится в коде, не плохой разработчик и используйте это на сайтах. Это функция полезности для разработки.

// Basic sleep function based on ms.
// DO NOT USE ON PUBLIC FACING WEBSITES.
function sleep(ms) {
    var unixtime_ms = new Date().getTime();
    while(new Date().getTime() < unixtime_ms + ms) {}
}
2
задан holdenmcgrohen 22 June 2015 в 15:53
поделиться

1 ответ

Хорошо, посмотрев исходный код NHibernate, я смог найти решение, которое работает и не особенно уродливо. Основная идея состоит в том, чтобы генерировать выражение SQL IN, не используя параметры.

Первое, что нужно сделать, это сделать класс ICriterion для этого выражения. Это должно быть сделано, чтобы избежать возможных инъекций SQL.

public class ParameterlessInExpression : AbstractCriterion
{
    private readonly IProjection _projection;
    private readonly object[] _values;

    /// <summary>
    /// Builds SQL 'IN' expression without using parameters
    /// NB: values must be an array of integers to avoid SQL-Injection.
    /// </summary>
    public ParameterlessInExpression(IProjection projection, int[] values)
    {
        _projection = projection;
        _values = values.Select(v => (object)v).ToArray();
    }

    public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary<string, IFilter> enabledFilters)
    {
        if (_values.Length == 0)
            return new SqlString("1=0");

        var result = new SqlStringBuilder();
        var columnNames = CriterionUtil.GetColumnNames(null, _projection, criteriaQuery, criteria, enabledFilters);    

        for (int columnIndex = 0; columnIndex < columnNames.Length; columnIndex++)
        {
            SqlString columnName = columnNames[columnIndex];

            if (columnIndex > 0)
                result.Add(" and ");

            result.Add(columnName).Add(" in (").Add(StringHelper.ToString(_values)).Add(")");
        }

        return result.ToSqlString();
    }

    // ...
    // some non-essential overrides omitted here
    // ...
}

Далее мы делаем хорошее расширение IQueryOver

public static IQueryOver<TRoot, TSubType> WhereIn<TRoot, TSubType>(this IQueryOver<TRoot, TSubType> query, Expression<Func<TSubType, object>> expression, int[] values)
{
    query.UnderlyingCriteria.Add(new ParameterlessInExpression(Projections.Property<TSubType>(expression), values));
    return query;
}

И окончательно используйте это в запросе:

if (command.Ids != null)
    result = result.WhereIn(o => o.Id, command.Ids);
7
ответ дан holdenmcgrohen 25 August 2018 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: