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); }
/// <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)); }