コード例 #1
0
        public Expression BuildPermissionEntityExpression(object context, ISet <EntityMutationInfo> cache, Expression memberExpression = null)
        {
            cache.Add(this);
            var isCreation = State == EntityState.Added;
            var entityParameterExpression       = isCreation ? null : memberExpression ?? Expression.Parameter(EntityType.ClrType);
            var selfPermissionBindingExpression = isCreation ? null : BuildSelfPermissionBinding(entityParameterExpression, context);
            var permissionPropertiesMemberBindingExpressions           = Properties.Values.Where(memberMutationInfo => memberMutationInfo.IsModified).Select(property => property.BuildMemberBindingExpression(entityParameterExpression, cache)).ToArray();
            var scalarNavigationPropertiesMemberBindingExpressions     = References.Values.Where(memberMutationInfo => memberMutationInfo.IsModified).Select(reference => reference.BuildMemberBindingExpression(entityParameterExpression, cache)).ToArray();
            var collectionNavigationPropertiesMemberBindingExpressions = Collections.Values.Where(memberMutationInfo => memberMutationInfo.IsModified).Select(collection => collection.BuildMemberBindingExpression(entityParameterExpression, cache)).ToArray();


            var memberBindingExpressions = permissionPropertiesMemberBindingExpressions.Union(scalarNavigationPropertiesMemberBindingExpressions).Union(collectionNavigationPropertiesMemberBindingExpressions);

            if (selfPermissionBindingExpression != null)
            {
                memberBindingExpressions = memberBindingExpressions.Append(selfPermissionBindingExpression).ToArray();
            }
            memberBindingExpressions = memberBindingExpressions.Where(memberBinding => memberBinding != null);
            if (memberBindingExpressions.Any())
            {
                if (entityParameterExpression != null)
                {
                    var primaryKeyBindingExpression = PrimaryKey.Properties.Select(primaryKeyProperty => Expression.Bind(PermissionType.GetProperty(primaryKeyProperty.Name), Expression.MakeMemberAccess(entityParameterExpression, primaryKeyProperty.PropertyInfo)));
                    memberBindingExpressions = primaryKeyBindingExpression.Union(memberBindingExpressions);
                }
                var permissionEntityType    = MutationContext.PermissionEntityTypeBuilder.TypeMap[EntityType];
                var newPermissionExpression = BuildNewPermissionMemberInitExpression(permissionEntityType, memberBindingExpressions.ToArray());
                if (memberExpression == null)
                {
                    var findEntityExpression = State == EntityState.Added ? null : BuildFindEntityQuery();
                    var permissionExpression = findEntityExpression == null ? newPermissionExpression : BuildSelectFirstOrDefaultPermissionEntityExpression(findEntityExpression, (ParameterExpression)entityParameterExpression, newPermissionExpression);
                    return(permissionExpression);
                }
                else
                {
                    return(newPermissionExpression);
                }
            }
            return(null);
        }