Ejemplo n.º 1
0
        public Expression <Func <TDocument, bool> > AddSystemFilter <TDocument>(Expression <Func <TDocument, bool> > filter) where TDocument : Document
        {
            var tenants = new[] { _tenantProvider.GetTenantId(), DocumentStorageHelpers.AnonymousUser };

            Expression <Func <TDocument, bool> > systemFilter = i => tenants.Contains(i._header._tenant) && i._header._deleted == null;

            return((filter != null) ? LambdaExpressionComposer.Compose(filter, systemFilter, Expression.AndAlso) : systemFilter);
        }
Ejemplo n.º 2
0
            /// <summary>
            /// Объединяет выражения с использованием указанной функции.
            /// </summary>
            public static Expression <T> Compose <T>(Expression <T> first, Expression <T> second, Func <Expression, Expression, Expression> composeFunc)
            {
                // Таблица соответствий параметров первого и второго выражений
                var secondToFirstMap = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f);

                // Переименование параметров второго выражения
                var newSecondBody = new LambdaExpressionComposer(secondToFirstMap).Visit(second.Body);

                // Объединение выражений заданной операцией
                return(Expression.Lambda <T>(composeFunc(first.Body, newSecondBody), first.Parameters));
            }