Когда Вы используете + = или - =, когда делегат вводит, который просто звонит к Delegate.Combine
и Delegate.Remove
.
важная вещь о многоадресных делегатах состоит в том, что возвращаемое значение все кроме последнего выполняемого делегата проигнорированы. Они все выполняются (если исключение не выдается), но только последнее возвращаемое значение используется.
Для предикатов, Вы могли бы хотеть сделать что-то как:
public static Func<T, bool> And<T>(params Func<T, bool>[] predicates)
{
return t => predicates.All(predicate => predicate(t));
}
public static Func<T, bool> Or<T>(params Func<T, bool>[] predicates)
{
return t => predicates.Any(predicate => predicate(t));
}
Вы затем сделали бы:
Func<string, bool> predicate = And<string>(
t => t.Length > 10,
t => t.Length < 20);
РЕДАКТИРОВАНИЕ: вот более общее решение, которое довольно забавно, если немного причудливый...
public static Func<TInput, TOuput> Combine<TInput, TOutput>
(Func<TOutput, TOutput, TOutput> aggregator,
params Func<TInput, TOuput>[] delegates) {
// delegates[0] provides the initial value
return t => delegates.Skip(1).Aggregate(delegates[0](t), aggregator);
}
, Таким образом, Вы могли затем реализация И как:
public static Func<T, bool> And<T>(params Func<T, bool>[] predicates) {
return Combine<T, bool>((x, y) => x && y, predicates);
}
(я лично предпочитаю это по использованию GetInvocationList()
, потому что Вы заканчиваете с предикатом, который можно передать другим битам LINQ и т.д.)
У меня была та же проблема. Это устраняет проблему аккуратно и возвращает Список Длинных
List<Long> orgTypeIds = session.createSQLQuery("SELECT typeId FROM org_type_cd")
.addScalar("typeId", StandardBasicTypes.LONG)
.list();
касательно: https://matthewbusche.com/2016/06/08/hibernate-returning-bigdecimal-instead-of-long /