private bool CheckLocalReBuildRequired(IClearanceSource clearanceSource) { if (!ReferenceEquals(_LastClearanceSource, clearanceSource)) { _LocalFilterExpression = null; _LastClearanceSource = clearanceSource; } var ccDate = _LastClearanceSource.LastClearanceChangeDateUtc; if (ccDate > _ClearanceVersionWithinFilterExpression) { _LocalFilterExpression = null; _ClearanceVersionWithinFilterExpression = ccDate; } if (_LocalFilterExpression != null) { foreach (Type relatedType in _UpNavigations.Values) { if (EntityAccessControl.GetBuilderForEntity(relatedType).CheckLocalReBuildRequired(clearanceSource)) { _LocalFilterExpression = null; return(true); } } } return(_LocalFilterExpression == null); }
public static Expression BuildExpressionIncludingPrincipals(Type entityType, IClearanceSource clearanceSource) { var genmth = _GenericMethodIncludingPrincipals.MakeGenericMethod(entityType); var args = new object[] { clearanceSource }; return(genmth.Invoke(null, args) as Expression); }
public static Expression BuildExpressionForLocalEntity(Type entityType, IClearanceSource clearanceSource) { var genmth = _GenericMethodLocal.MakeGenericMethod(entityType); var args = new object[] { clearanceSource }; return(genmth.Invoke(null, args) as Expression); }
/// <summary> /// returns null when nothing to validate /// </summary> public Expression BuildUntypedLocalFilterExpression(IClearanceSource clearanceSource, Expression entitySourceExpression = null) { lock (this) { if (entitySourceExpression == null) { //in default we can use the lamba-entry parameter (which is our entity) entitySourceExpression = _EntityParameter; //we get external expressions, when we are called to build expression for just a part of the graph //in this case a member-expression which navigates from ou child up to us is passed via this arg... } if (!this.CheckLocalReBuildRequired(clearanceSource)) { return(_LocalFilterExpression); } //build expressions for local properties foreach (var kvp in _AcDimensionsPerPropertyName) { var propName = kvp.Key.Name; var dimensionName = kvp.Value; var propExpr = Expression.Property(entitySourceExpression, propName); string[] dimensionClearanceValues = clearanceSource.GetClearancesOfDimension(dimensionName); var localExpression = this.BuildAcValueOrExpressionForDimensionClearanceValues(propExpr, kvp.Key.PropertyType, dimensionClearanceValues); if (_LocalFilterExpression == null) { _LocalFilterExpression = localExpression; } else { _LocalFilterExpression = Expression.AndAlso(_LocalFilterExpression, localExpression); } } //can be null!!! return(_LocalFilterExpression); } }
/// <summary> /// returns null when nothing to validate /// </summary> public Expression BuildUntypedFilterExpressionIncludingPrincipals(IClearanceSource clearanceSource, Expression entitySourceExpression = null) { if (entitySourceExpression == null) { //in default we can use the lamba-entry parameter (which is our entity) entitySourceExpression = _EntityParameter; //we get external expressions, when we are called to build expression for just a part of the graph //in this case a member-expression which navigates from ou child up to us is passed via this arg... } Expression result = this.BuildUntypedLocalFilterExpression(clearanceSource, entitySourceExpression); foreach (var nav in _UpNavigations) { String navPropName = nav.Key.Name; Type parentEntityType = nav.Value; MemberExpression targetEntityNavigationExpression = MemberExpression.Property(entitySourceExpression, navPropName); var builderForParentEntityType = EntityAccessControl.GetBuilderForEntity(parentEntityType); Expression targetFilterExpression = builderForParentEntityType.BuildUntypedFilterExpressionIncludingPrincipals(clearanceSource, targetEntityNavigationExpression); //only when the nav has any filtering... if (targetFilterExpression != null) { if (result == null) { result = targetFilterExpression; } else { result = Expression.AndAlso(result, targetFilterExpression); } } } //can be null! return(result); }
public static Expression <Func <TEntity, bool> > BuildExpressionForLocalEntity <TEntity>(IClearanceSource clearanceSource) { return(GetBuilderForEntity(typeof(TEntity)).BuildTypedLambdaForLocal <TEntity>(clearanceSource)); }
public static Expression <Func <TEntity, bool> > BuildExpressionIncludingPrincipals <TEntity>(IClearanceSource clearanceSource) { return(GetBuilderForEntity(typeof(TEntity)).BuildTypedLambdaIncludingPrincipals <TEntity>(clearanceSource)); }
private Expression <Func <TEntity, bool> > BuildTypedLambdaIncludingPrincipals <TEntity>(IClearanceSource clearanceSource, Expression entitySourceExpression = null) { Expression body = this.BuildUntypedFilterExpressionIncludingPrincipals(clearanceSource); if (body == null) { body = BinaryExpression.Constant(true); } return(Expression.Lambda <Func <TEntity, bool> >(body, _EntityParameter)); }