private ListInstance ExtractFields(Web web, List siteList, List<FieldRef> contentTypeFields, ListInstance list, ListCollection lists) { var siteColumns = web.Fields; web.Context.Load(siteColumns, scs => scs.Include(sc => sc.Id)); web.Context.ExecuteQueryRetry(); var allowedFields = siteList.Fields.Where(field => !(BuiltInFieldId.Contains(field.Id) && field.Hidden)); foreach (var field in allowedFields) { if (siteColumns.FirstOrDefault(sc => sc.Id == field.Id) != null) { var addField = true; if (siteList.ContentTypesEnabled && contentTypeFields.FirstOrDefault(c => c.Id == field.Id) == null) { if (contentTypeFields.FirstOrDefault(c => c.Id == field.Id) == null) { addField = false; } } var fieldElement = XElement.Parse(field.SchemaXml); var sourceId = fieldElement.Attribute("SourceID") != null ? fieldElement.Attribute("SourceID").Value : null; if (sourceId != null && sourceId == "http://schemas.microsoft.com/sharepoint/v3") { if (field.InternalName == "Editor" || field.InternalName == "Author" || field.InternalName == "Title" || field.InternalName == "ID" || field.InternalName == "Created" || field.InternalName == "Modified" || field.InternalName == "Attachments" || field.InternalName == "_UIVersionString" || field.InternalName == "DocIcon" || field.InternalName == "LinkTitleNoMenu" || field.InternalName == "LinkTitle" || field.InternalName == "Edit" || field.InternalName == "AppAuthor" || field.InternalName == "AppEditor" || field.InternalName == "ContentType" || field.InternalName == "ItemChildCount" || field.InternalName == "FolderChildCount" || field.InternalName == "LinkFilenameNoMenu" || field.InternalName == "LinkFilename" || field.InternalName == "_CopySource" || field.InternalName == "ParentVersionString" || field.InternalName == "ParentLeafName" || field.InternalName == "_CheckinComment" || field.InternalName == "FileLeafRef" || field.InternalName == "FileSizeDisplay" || field.InternalName == "Preview" || field.InternalName == "ThumbnailOnForm") { addField = false; } } if (addField) { list.FieldRefs.Add(new FieldRef(field.InternalName) { Id = field.Id, DisplayName = field.Title, Required = field.Required, Hidden = field.Hidden, }); if (field.TypeAsString.StartsWith("TaxonomyField")) { // find the corresponding taxonomy field and include it anyway var taxField = (TaxonomyField)field; taxField.EnsureProperties(f => f.TextField, f => f.Id); var noteField = siteList.Fields.GetById(taxField.TextField); web.Context.Load(noteField, nf => nf.Id, nf => nf.Title, nf => nf.Required, nf => nf.Hidden, nf => nf.InternalName); web.Context.ExecuteQueryRetry(); list.FieldRefs.Insert(0, new FieldRef(noteField.InternalName) { Id = noteField.Id, DisplayName = noteField.Title, Required = noteField.Required, Hidden = noteField.Hidden }); } } } else { var schemaXml = ParseFieldSchema(field.SchemaXml, lists); var fieldElement = XElement.Parse(field.SchemaXml); var listId = fieldElement.Attribute("List") != null ? fieldElement.Attribute("List").Value : null; if (listId == null) list.Fields.Add((new Model.Field { SchemaXml = field.SchemaXml })); else { var listIdValue = Guid.Empty; if (Guid.TryParse(listId, out listIdValue)) { var sourceList = lists.AsEnumerable().Where(l => l.Id == listIdValue).FirstOrDefault(); if (sourceList != null) fieldElement.Attribute("List").SetValue(String.Format("{{listid:{0}}}", sourceList.Title)); } list.Fields.Add(new Model.Field { SchemaXml = fieldElement.ToString() }); } if (field.TypeAsString.StartsWith("TaxonomyField")) { // find the corresponding taxonomy field and include it anyway var taxField = (TaxonomyField)field; taxField.EnsureProperties(f => f.TextField, f => f.Id); var noteField = siteList.Fields.GetById(taxField.TextField); web.Context.Load(noteField, nf => nf.SchemaXml); web.Context.ExecuteQueryRetry(); var noteSchemaXml = XElement.Parse(noteField.SchemaXml); noteSchemaXml.Attribute("SourceID").Remove(); list.Fields.Insert(0, new Model.Field { SchemaXml = ParseFieldSchema(noteSchemaXml.ToString(), lists) }); } } } return list; }