/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> protected virtual Expression CreateConstructorExpression( [NotNull] IEntityType entityType, [CanBeNull] ParameterExpression parameter) { var count = GetPropertyCount(entityType); var types = new Type[count]; var propertyBases = new IPropertyBase[count]; foreach (var propertyBase in entityType.GetPropertiesAndNavigations()) { var index = GetPropertyIndex(propertyBase); if (index >= 0) { types[index] = (propertyBase as IProperty)?.ClrType ?? typeof(object); propertyBases[index] = propertyBase; } } Expression constructorExpression; if (count > Snapshot.MaxGenericTypes) { var snapshotExpressions = new List <Expression>(); for (var i = 0; i < count; i += Snapshot.MaxGenericTypes) { snapshotExpressions.Add( CreateSnapshotExpression( entityType.ClrType, parameter, types.Skip(i).Take(Snapshot.MaxGenericTypes).ToArray(), propertyBases.Skip(i).Take(Snapshot.MaxGenericTypes).ToList())); } constructorExpression = Expression.Convert( Expression.New( MultiSnapshot.Constructor, Expression.NewArrayInit(typeof(ISnapshot), snapshotExpressions)), typeof(ISnapshot)); } else { constructorExpression = CreateSnapshotExpression(entityType.ClrType, parameter, types, propertyBases); } return(constructorExpression); }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> protected virtual Expression CreateConstructorExpression( [NotNull] IEntityType entityType, [CanBeNull] ParameterExpression parameter) { var count = GetPropertyCount(entityType); var types = new Type[count]; var propertyBases = new IPropertyBase[count]; foreach (var propertyBase in entityType.GetPropertiesAndNavigations()) { var index = GetPropertyIndex(propertyBase); if (index >= 0) { types[index] = (propertyBase as IProperty)?.ClrType ?? typeof(object); propertyBases[index] = propertyBase; } } Expression constructorExpression; if (count > Snapshot.MaxGenericTypes) { var snapshotExpressions = new List<Expression>(); for (var i = 0; i < count; i += Snapshot.MaxGenericTypes) { snapshotExpressions.Add( CreateSnapshotExpression( entityType.ClrType, parameter, types.Skip(i).Take(Snapshot.MaxGenericTypes).ToArray(), propertyBases.Skip(i).Take(Snapshot.MaxGenericTypes).ToList())); } constructorExpression = Expression.Convert( Expression.New( MultiSnapshot.Constructor, Expression.NewArrayInit(typeof(ISnapshot), snapshotExpressions)), typeof(ISnapshot)); } else { constructorExpression = CreateSnapshotExpression(entityType.ClrType, parameter, types, propertyBases); } return constructorExpression; }