Генерация метода для linq в NHibernate для среднего времени - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь заставить avg работать на временные рамки в linq для NHibernate.

Я добавил реестр:

public class CustomLinqToHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry
{
    public CustomLinqToHqlGeneratorsRegistry()
    {
        this.Merge(new AvgTimeSpanGenerator());
    }
}

Генератор:

public class AvgTimeSpanGenerator : BaseHqlGeneratorForMethod
{
     public AvgTimeSpanGenerator()
    {
        SupportedMethods = new[]
        {
             NHibernate.Linq.ReflectionHelper.GetMethodDefinition<IEnumerable<TimeSpan>>(x => x.Avg())
        };
    }

    public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
    {
        return treeBuilder.MethodCall("Avg", visitor.Visit(targetObject).AsExpression());
    }
}

Пожалуйста, обратите внимание, что моя BuildHql реализация может быть неправильной (на самом деле я ее не особо продумал), но я установил там точку останова, и она никогда не была достигнута.

И метод:

public static class NHibernateLinqExtension
{
    public static TimeSpan Avg(this IEnumerable<TimeSpan> timeSpan)
    {
        return new TimeSpan((long)timeSpan.Select(x => x.Ticks).Average());
    }
}

Я также зарегистрировал реестр в NHibernate:

configuration.LinqToHqlGeneratorsRegistry<CustomLinqToHqlGeneratorsRegistry>();

Но когда я выполняю запрос:

var data = (from tcdr in uow.UnitOfWorkSession.Query<TCDR>()
                group tcdr.Duration by tcdr.Name into g
                select new
                {
                    MaxDuration = g.Max(),
                    MinDuration = g.Min(),
                    AvgDuration = g.Avg()
                }).ToList();

Выдает InvalidOperationException Code supposed to be unreachable

Любойключ?

1 Ответ

0 голосов
/ 29 мая 2018

Агрегирующее выражение требует специальной обработки, см. MergeAggregatingResultsRewriter.К сожалению, этот класс нельзя вводить с большим количеством поведения, и конвейер перезаписи вызывает пользовательские перезаписчики (см. настройка query.query_model_rewriter_factory) слишком поздно (строка 72) ,поскольку агрегации должны обрабатываться перед группой переписчиками (строка 39) .

Все это относится к NHibernate 5.1.2.

Мне кажется, вы используетеверсия ниже, чем 5, но вы, вероятно, застряли так же.

Я не думаю, что вы, возможно, сможете обработать ваш пользовательский TimeSpan среднее значение в безнекоторые изменения в коде NHibernate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...