public virtual Expression CreateMaterializeExpression( IEntityType entityType, string entityInstanceName, Expression materializationContextExpression) { if (!entityType.HasClrType()) { throw new InvalidOperationException(CoreStrings.NoClrType(entityType.DisplayName())); } if (entityType.IsAbstract()) { throw new InvalidOperationException(CoreStrings.CannotMaterializeAbstractType(entityType)); } var constructorBinding = (InstantiationBinding)entityType[CoreAnnotationNames.ConstructorBinding]; if (constructorBinding == null) { var constructorInfo = entityType.ClrType.GetDeclaredConstructor(null); if (constructorInfo == null) { throw new InvalidOperationException(CoreStrings.NoParameterlessConstructor(entityType.DisplayName())); } constructorBinding = new ConstructorBinding(constructorInfo, Array.Empty <ParameterBinding>()); } var bindingInfo = new ParameterBindingInfo( entityType, materializationContextExpression); var properties = new HashSet <IPropertyBase>( entityType.GetServiceProperties().Cast <IPropertyBase>() .Concat( entityType .GetProperties() .Where(p => !p.IsShadowProperty()))); foreach (var consumedProperty in constructorBinding .ParameterBindings .SelectMany(p => p.ConsumedProperties)) { properties.Remove(consumedProperty); } var constructorExpression = constructorBinding.CreateConstructorExpression(bindingInfo); if (properties.Count == 0) { return(constructorExpression); } var instanceVariable = Expression.Variable(constructorBinding.RuntimeType, entityInstanceName); var blockExpressions = new List <Expression> { Expression.Assign( instanceVariable, constructorExpression) }; var valueBufferExpression = Expression.Call(materializationContextExpression, MaterializationContext.GetValueBufferMethod); foreach (var property in properties) { var memberInfo = property.GetMemberInfo(forMaterialization: true, forSet: true); var readValueExpression = property is IServiceProperty serviceProperty ? serviceProperty.GetParameterBinding().BindToParameter(bindingInfo) : CreateReadValueExpression( valueBufferExpression, memberInfo.GetMemberType(), property.GetIndex(), property); blockExpressions.Add( Expression.MakeMemberAccess( instanceVariable, memberInfo).Assign( readValueExpression)); } blockExpressions.Add(instanceVariable); return(Expression.Block( new[] { instanceVariable }, blockExpressions)); }