Перегидратирование быстрого nhibernate настроило DateTime как Вид UTC, а не Неуказанный

Цикл for является обязательным, алгоритмы декларативными. Когда вы пишете std::max_element, очевидно, что вам нужно, когда вы используете цикл для достижения того же самого, это не обязательно так.

Алгоритмы также могут иметь небольшое преимущество в производительности. Например, при обходе std::deque специализированный алгоритм может избежать избыточной проверки того, перемещает ли данный инкремент указатель за границу фрагмента.

Однако сложные выражения функторов быстро делают вызовы алгоритма нечитаемыми. Если явный цикл более читабелен, используйте его. Если вызов алгоритма может быть выражен без десятиуровневых выражений связывания, то все равно предпочитайте его. Читаемость здесь важнее, чем производительность , здесь , потому что этот вид оптимизации - то, что Кнут так классно приписывает Хоару; вы сможете без проблем использовать другую конструкцию, если поймете, что это узкое место.

17
задан g . 26 October 2009 в 16:55
поделиться

1 ответ

This isn't specific to fluent, but is fundamental to the NHibernate mapping. We use an interceptor to specify the Kind. It is similar to the approach in this blog post which lists a couple alternatives. There is also a proposed patch (NH-1135) for handling UtcDateTime and LocalDateTime natively. I'd encourage you to vote for it.

public class InterceptorBase : EmptyInterceptor
{
    public override bool OnLoad(object entity, object id, object[] state,
        string[] propertyNames, IType[] types)
    {
        ConvertDatabaseDateTimeToUtc(state, types);
        return true;
    }

    private void ConvertDatabaseDateTimeToUtc(object[] state, IList<IType> types)
    {
        for (int i = 0; i < types.Count; i++)
        {
            if (types[i].ReturnedClass != typeof(DateTime))
                continue;

            DateTime? dateTime = state[i] as DateTime?;

            if (!dateTime.HasValue)
                continue;

            if (dateTime.Value.Kind != DateTimeKind.Unspecified)
                continue;

            state[i] = DateTime.SpecifyKind(dateTime.Value, DateTimeKind.Utc);
        }
    }
}
12
ответ дан 30 November 2019 в 10:36
поделиться
Другие вопросы по тегам:

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