/// <summary>
        /// Builds <see cref="BreezeMetadata"/>.
        /// </summary>
        /// <returns>The breeze metadata.</returns>
        public BreezeMetadata Build()
        {
            var metadata = new BreezeMetadata
            {
                StructuralTypes             = new List <StructuralType>(),
                ResourceEntityTypeMap       = new Dictionary <string, string>(),
                EnumTypes                   = new List <EnumType>(),
                LocalQueryComparisonOptions = _localQueryComparisonOptions ?? "caseInsensitiveSQL"
            };

            _addedTypes.Clear();
            _entityMetadata = _classMetadataProvider.GetAll()
                              .Select(o => o.MappedClass)
                              .Where(o => o != null)
                              .Where(o => _includePredicate?.Invoke(o) ?? true)
                              .Distinct()
                              .Select(o => new { MappedClass = o, Metadata = _entityMetadataProvider.GetMetadata(o) })
                              .ToDictionary(o => o.MappedClass, o => o.Metadata);

            foreach (var entityMetadata in _entityMetadata.Values)
            {
                AddEntityType(entityMetadata, metadata);
            }

            if (_clientModelAssemblies == null)
            {
                return(metadata);
            }

            // Add client models
            _clientModelMetadata = _clientModelAssemblies?.SelectMany(assembly => assembly.GetTypes()
                                                                      .Where(t => t.IsClass && !t.IsAbstract && _clientModelMetadataProvider.IsClientModel(t)))
                                   .Where(t => _includePredicate?.Invoke(t) ?? true)
                                   .Select(o => _clientModelMetadataProvider.GetMetadata(o))
                                   .ToDictionary(o => o.Type, o => o);

            foreach (var modelMetadata in _clientModelMetadata.Values)
            {
                AddClientModelType(modelMetadata, metadata);
            }

            return(metadata);
        }