public void Test() { string caml = CAML.Where() .Any( CAML.Expression().TextField("Email").EqualTo("*****@*****.**"), CAML.Expression().TextField("Email").EqualTo("*****@*****.**"), CAML.Expression().TextField("Title").BeginsWith("[Google]"), CAML.Expression().TextField("Content").Contains("Google") ) .ToString(); string expected = @"<Where> <Or> <Eq><FieldRef Name=""Email"" /><Value Type=""Text"">[email protected]</Value></Eq> <Or> <Eq><FieldRef Name=""Email"" /><Value Type=""Text"">[email protected]</Value></Eq> <Or> <BeginsWith><FieldRef Name=""Title"" /><Value Type=""Text"">[Google]</Value></BeginsWith> <Contains><FieldRef Name=""Content"" /><Value Type=""Text"">Google</Value></Contains> </Or> </Or> </Or> </Where>"; Assert.AreEqual(Beautify.Xml(expected), Beautify.Xml(caml)); }
/// <summary> /// Retreive file from the specified folder /// </summary> /// <param name="onlineLibrary"></param> /// <param name="destinationFolder"></param> /// <param name="onlineFileName"></param> /// <returns></returns> public static ListItem GetFileInFolder(this List onlineLibrary, Folder destinationFolder, string onlineFileName) { destinationFolder.Context.Load(destinationFolder, afold => afold.ServerRelativeUrl); destinationFolder.Context.ExecuteQuery(); var relativeUrl = destinationFolder.ServerRelativeUrl; var context = destinationFolder.Context; try { CamlQuery camlQuery = new CamlQuery(); var camlAndValue = CAML.And( CAML.Eq(CAML.FieldValue("LinkFilename", FieldType.Text.ToString("f"), onlineFileName)), CAML.Eq(CAML.FieldValue("FileDirRef", FieldType.Text.ToString("f"), relativeUrl))); camlQuery.ViewXml = CAML.ViewQuery(ViewScope.RecursiveAll, CAML.Where(camlAndValue), string.Empty, CAML.ViewFields(CAML.FieldRef("Title")), 5); ListItemCollection listItems = onlineLibrary.GetItems(camlQuery); context.Load(listItems); context.ExecuteQuery(); if (listItems.Count() > 0) { var newItem = listItems.FirstOrDefault(); return(newItem); } } catch (Exception ex) { System.Diagnostics.Trace.TraceError("Failed to retrieve file {0} MSG:{1}", onlineFileName, ex.Message); } return(null); }
public void Test() { var caml = CAML.Where() .LookupField("Category").Id().In(new int[] { 2, 3, 10 }) .And() .DateField("ExpirationDate").GreaterThan(CamlValues.Now) .OrderBy("ExpirationDate") .ToString(); string expected = @"<Where> <And> <In> <FieldRef Name=""Category"" LookupId=""True"" /> <Values> <Value Type=""Integer"">2</Value> <Value Type=""Integer"">3</Value> <Value Type=""Integer"">10</Value> </Values> </In> <Gt> <FieldRef Name=""ExpirationDate"" /> <Value Type=""DateTime""> <Now /> </Value> </Gt> </And> </Where> <OrderBy> <FieldRef Name=""ExpirationDate"" /> </OrderBy>"; Assert.AreEqual(Beautify.Xml(expected), Beautify.Xml(caml)); }
public void Test() { var caml = CAML.Where() .UserField("AssignedTo").EqualToCurrentUser() .Or() .UserField("AssignedTo").IsInCurrentUserGroups() .GroupBy("Category") .OrderBy("Priority").ThenBy("Title") .ToString(); string expected = @"<Where> <Or> <Eq><FieldRef Name=""AssignedTo"" LookupId=""True"" /><Value Type=""Integer""><UserID /></Value></Eq> <Membership Type=""CurrentUserGroups""><FieldRef Name=""AssignedTo"" /></Membership> </Or> </Where> <GroupBy> <FieldRef Name=""Category"" /> </GroupBy> <OrderBy> <FieldRef Name=""Priority"" /><FieldRef Name=""Title"" /> </OrderBy>"; Assert.AreEqual(Beautify.Xml(expected), Beautify.Xml(caml)); }
public ActionResult Index(string category = "") { var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext); using (var clientContext = HttpContext.GetUserClientContextForSPHost()) { ViewBag.SPHostUrl = spContext.SPHostUrl; ViewBag.Category = category; var list = clientContext.Web.GetListByTitle(ListDetails.EventsListName); var categoryQuery = string.Empty; if (!string.IsNullOrEmpty(category)) { categoryQuery = CAML.Where(CAML.Eq(CAML.FieldValue(Event.FIELD_CATEGORY, "Text", category))); } var orderByQuery = CAML.OrderBy(new OrderByField("Title")); var caml = new CamlQuery() { ViewXml = CAML.ViewQuery(categoryQuery, orderByQuery, rowLimit: 50) }; var events = list.GetItems(caml); clientContext.Load(events); clientContext.ExecuteQuery(); var eventsList = events.Cast <ListItem>().Select(item => new Event(item)).ToList(); return(View(eventsList)); } }
public ActionResult Featured(int maxCount = 3) { using (var clientContext = HttpContext.GetUserClientContextForSPHost()) { ViewBag.SPHostUrl = HttpContext.Request.QueryString["SPHostUrl"]; var caml = new CamlQuery() { ViewXml = CAML.ViewQuery( CAML.Where( CAML.And( CAML.Geq( CAML.FieldValue(Event.FIELD_DATE, "Date", CAML.Today()) ), CAML.Eq( CAML.FieldValue(Event.FIELD_CATEGORY, "Text", "Featured") ) ) ), CAML.OrderBy(new OrderByField(Event.FIELD_DATE)), rowLimit: maxCount) }; var list = clientContext.Web.Lists.GetByTitle(ListDetails.EventsListName); clientContext.Load(list); clientContext.ExecuteQuery(); var items = list.GetItems(caml); clientContext.Load(items); clientContext.ExecuteQuery(); var result = items.Cast <ListItem>() .Select(i => new Event(i)).ToList(); return(View(result)); } }
public void Test() { var caml = CAML.Where().DateTimeField("Created").GreaterThan(new DateTime(2013, 1, 1, 0, 0, 0, DateTimeKind.Utc)).ToString(); string expected = @"<Where> <Gt> <FieldRef Name=""Created"" /> <Value IncludeTimeValue=""True"" Type=""DateTime"">2013-01-01T00:00:00.000Z</Value> </Gt> </Where>"; Assert.AreEqual(Beautify.Xml(expected), Beautify.Xml(caml)); }
public void Tag_ComplicatedQuery_DoesNotThrowXmlException() { Assert.DoesNotThrow(() => { var fieldRefId = CAML.FieldRef(BuiltInInternalFieldNames.ID); var orderByAsCaml = CAML.OrderBy( CAML.FieldRef(BuiltInInternalFieldNames.ID, CAML.SortType.Ascending) ); var viewFields = new List <string> { BuiltInInternalFieldNames.ID, BuiltInInternalFieldNames.Title }; var viewFieldsAsCaml = CAML.ViewFieldsByFieldNames(viewFields.ToArray()); const int maxRowLimit = 1000; var rowLimitAsCaml = CAML.RowLimit(maxRowLimit); const int startId = 1; const int endId = maxRowLimit; CAML.View( string.Concat( CAML.Query( string.Concat( CAML.Where( CAML.And( CAML.Geq( fieldRefId, CAML.Value(startId) ), CAML.Leq( fieldRefId, CAML.Value(endId) ) ) ), orderByAsCaml ) ), viewFieldsAsCaml, rowLimitAsCaml ) ); }); }
public void Test() { var caml = CAML.Where().CounterField("ID").In(new int[] { 1, 2, 3 }).ToString(); string expected = @"<Where> <In> <FieldRef Name=""ID"" /> <Values> <Value Type=""Counter"">1</Value> <Value Type=""Counter"">2</Value> <Value Type=""Counter"">3</Value> </Values> </In> </Where>"; Assert.AreEqual(Beautify.Xml(expected), Beautify.Xml(caml)); }
/// <summary> /// Returns the parent item ID /// </summary> /// <param name="cContext"></param> /// <param name="ItemName"></param> /// <param name="ParentListName"></param> /// <returns></returns> internal int GetParentItemID(ClientContext cContext, string ItemName, string ParentListName) { int nReturn = -1; try { LogVerbose("Start GetParentItemID"); Web wWeb = cContext.Web; List lParentList = cContext.Web.Lists.GetByTitle(ParentListName); CamlQuery camlQuery = new CamlQuery { ViewXml = CAML.Where(CAML.Eq(CAML.FieldValue("Title", FieldType.Text.ToString("f"), ItemName))) }; ListItemCollection collListItem = lParentList.GetItems(camlQuery); cContext.Load(collListItem); cContext.ExecuteQuery(); foreach (ListItem oListItem in collListItem) { if (oListItem["Title"].ToString() == ItemName) { nReturn = oListItem.Id; break; } } LogVerbose("Complete GetParentItemID"); } catch (Exception ex) { LogError(ex, ex.Message); } return(nReturn); }
public void Test() { var caml = CAML.Where() .All( CAML.Expression().All( CAML.Expression().BooleanField("Enabled").IsTrue(), CAML.Expression().UserMultiField("TargetAudience").IncludesSuchItemThat().ValueAsText().EqualTo("55").Or().UserMultiField("TargetAudience").IncludesSuchItemThat().ValueAsText().EqualTo("66") ), CAML.Expression().Any( CAML.Expression().TextField("NotificationScope").EqualTo("77"), CAML.Expression().TextField("NotificationScope").EqualTo("88").And().TextField("ScopeWebRelativeUrl").EqualTo("99") ) ) .ToString(); string expected = @"<Where> <And> <And> <Eq><FieldRef Name=""Enabled"" /><Value Type=""Integer"">1</Value></Eq> <Or> <Eq><FieldRef Name=""TargetAudience"" /><Value Type=""Text"">55</Value></Eq> <Eq><FieldRef Name=""TargetAudience"" /><Value Type=""Text"">66</Value></Eq> </Or> </And> <Or> <Eq><FieldRef Name=""NotificationScope"" /><Value Type=""Text"">77</Value></Eq> <And> <Eq><FieldRef Name=""NotificationScope"" /><Value Type=""Text"">88</Value></Eq> <Eq><FieldRef Name=""ScopeWebRelativeUrl"" /><Value Type=""Text"">99</Value></Eq> </And> </Or> </And> </Where>"; Assert.AreEqual(Beautify.Xml(expected), Beautify.Xml(caml)); }
/// <summary> /// Process the request /// </summary> public override void ExecuteCmdlet() { base.ExecuteCmdlet(); siteColumns = new List <SPFieldDefinitionModel>(); try { //Load list var siteUrl = this.ClientContext.Url; var listInSite = this.ClientContext.Web.Lists.GetByTitle(ListTitle); this.ClientContext.Load(listInSite); this.ClientContext.ExecuteQuery(); //#TODO: Provision datamigrated column for holder var camlWhereClause = CAML.Neq(CAML.FieldValue("DataMigrated", "Integer", "1")); var camlViewFields = CAML.ViewFields((new string[] { "Modified", "", "", "Id" }).Select(s => CAML.FieldRef(s)).ToArray()); // get site and query the list for approved requests ListItemCollectionPosition ListItemCollectionPosition = null; var camlQuery = new CamlQuery() { ViewXml = CAML.ViewQuery(ViewScope.RecursiveAll, CAML.Where(camlWhereClause), string.Empty, camlViewFields, 50) }; var output = new List <object>(); while (true) { camlQuery.ListItemCollectionPosition = ListItemCollectionPosition; var spListItems = listInSite.GetItems(camlQuery); this.ClientContext.Load(spListItems, lti => lti.ListItemCollectionPosition, lti => lti.IncludeWithDefaultProperties(lnc => lnc.Id, lnc => lnc.ContentType)); this.ClientContext.ExecuteQuery(); ListItemCollectionPosition = spListItems.ListItemCollectionPosition; foreach (var requestItem in spListItems) { var requestId = requestItem.Id; ListItem _item = listInSite.GetItemById(requestId); ClientContext.Load(_item); ClientContext.ExecuteQueryRetry(); try { output.Add(ProcessListItem(_item)); } catch (Exception e) { LogError(e, "Failed to update list item {0}", e.Message); } } if (ListItemCollectionPosition == null) { break; } } LogVerbose("Writing objects to memory stream."); output.ForEach(s => WriteObject(s)); } catch (Exception ex) { LogError(ex, "Migrate failed for list items MSG:{0}", ex.Message); } }
public override void ExecuteCmdlet() { base.ExecuteCmdlet(); var objects = new List <SPWorkflowInstance>(); var FieldDefinitions = new List <SPFieldDefinitionModel> { new SPFieldDefinitionModel(FieldType.Boolean) { FieldGuid = new Guid("da2872c4-e9b6-4804-9837-6e9dd85ecd7e"), InternalName = FieldBoolean_RestartWorkflow, Description = "RestartWorkflow provides a way to identify items that should be restarted.", Title = FieldBoolean_RestartWorkflow, MaxLength = 255, DefaultValue = "No" } }; var SelectedWeb = this.ClientContext.Web; Ilogger = new DefaultUsageLogger( (string msg, object[] margs) => { LogVerbose(msg, margs); }, (string msg, object[] margs) => { LogWarning(msg, margs); }, (Exception ex, string msg, object[] margs) => { LogError(ex, msg, margs); }); var list = List.GetList(SelectedWeb, lctx => lctx.Id, lctx => lctx.Title); var workflowSubscriptionId = new List <Guid>(); if (!string.IsNullOrEmpty(WorkflowName)) { var servicesManager = new WorkflowServicesManager(ClientContext, SelectedWeb); var subscriptionService = servicesManager.GetWorkflowSubscriptionService(); var subscriptions = subscriptionService.EnumerateSubscriptionsByList(list.Id); ClientContext.Load(subscriptions); ClientContext.ExecuteQueryRetry(); subscriptions.Where(subs => subs.Name == WorkflowName).Select(s => s.Id).ToList().ForEach(subscriptionId => { workflowSubscriptionId.Add(subscriptionId); }); } // Check if the field exists var viewFields = new string[] { "Id", "Title", FieldBoolean_RestartWorkflow }; var internalFields = new List <string>(); internalFields.AddRange(FieldDefinitions.Select(s => s.InternalName)); try { var checkFields = list.GetFields(internalFields.ToArray()); } catch (Exception ex) { Ilogger.LogError(ex, "Failed to retreive the fields {0}", ex.Message); foreach (var field in FieldDefinitions) { // provision the column var provisionedColumn = list.CreateListColumn(field, Ilogger, null); if (provisionedColumn != null) { internalFields.Add(provisionedColumn.InternalName); } } } var workflowStati = new List <Microsoft.SharePoint.Client.WorkflowServices.WorkflowStatus>() { Microsoft.SharePoint.Client.WorkflowServices.WorkflowStatus.Started }; var rowprocessed = 0; var rowdx = 0; var totaldx = 0; var startedDirty = false; var viewFieldXml = CAML.ViewFields(viewFields.Select(s => CAML.FieldRef(s)).ToArray()); var initiateWFCaml = new CamlQuery() { ViewXml = CAML.ViewQuery(ViewScope.RecursiveAll, CAML.Where(CAML.Eq(CAML.FieldValue(FieldBoolean_RestartWorkflow, FieldType.Boolean.ToString("f"), 1.ToString()))), string.Empty, viewFieldXml, 100), ListItemCollectionPosition = null }; do { var items = list.GetItems(initiateWFCaml); list.Context.Load(items, ftx => ftx.ListItemCollectionPosition, ftx => ftx.Include(ftcx => ftcx.Id, ftcx => ftcx.ParentList.Id, ftcx => ftcx[FieldBoolean_RestartWorkflow])); list.Context.ExecuteQueryRetry(); initiateWFCaml.ListItemCollectionPosition = items.ListItemCollectionPosition; rowprocessed = items.Count(); rowdx = 0; totaldx = rowprocessed; foreach (var item in items) { rowdx++; totaldx--; var itemId = item.Id; var allinstances = SelectedWeb.GetWorkflowInstances(item); if (!allinstances.Any(w => workflowStati.Any(wx => wx == w.Status))) { foreach (var subscriptionId in workflowSubscriptionId) { Ilogger.LogWarning($"List Item {itemId} => Restarting subscription {subscriptionId}"); var instanceId = item.StartWorkflowInstance(subscriptionId, new Dictionary <string, object>()); Ilogger.LogWarning($"List Item {itemId} => Successfully restarted subscription {subscriptionId} with new instance Id {instanceId}"); startedDirty = true; objects.Add(new SPWorkflowInstance() { Id = instanceId, WorkflowSubscriptionId = subscriptionId, ListItemId = itemId, InstanceCreated = DateTime.UtcNow }); } var wfItem = list.GetItemById(itemId); list.Context.Load(wfItem); wfItem[FieldBoolean_RestartWorkflow] = false; wfItem.SystemUpdate(); } if (startedDirty && (rowdx >= 50 || totaldx <= 0)) { list.Context.ExecuteQueryRetry(); Ilogger.LogInformation($"Processing {rowprocessed} rows; Persisted {rowdx} rows; {totaldx} remaining"); rowdx = 0; } } }while (initiateWFCaml.ListItemCollectionPosition != null); WriteObject(objects, true); }
/// <summary> /// Retrieves or creates the folder as a ListItem /// </summary> /// <param name="onlineLibrary"></param> /// <param name="destinationFolder"></param> /// <param name="folderName"></param> /// <param name="defaultLastItemId"></param> /// <returns>The listitem as a folder</returns> public static Folder GetOrCreateFolder(this List onlineLibrary, Folder destinationFolder, string folderName, int?defaultLastItemId = default(int?)) { destinationFolder.EnsureProperties(afold => afold.ServerRelativeUrl, afold => afold.Folders); var folderRelativeUrl = destinationFolder.ServerRelativeUrl; // Remove invalid characters var trimmedFolder = HelperExtensions.GetCleanDirectory(folderName, string.Empty); ListItem folderItem = null; var camlFields = new string[] { "Title", "ContentType", "ID" }; var camlViewFields = CAML.ViewFields(camlFields.Select(s => CAML.FieldRef(s)).ToArray()); var camlClause = CAML.And( CAML.And( CAML.Eq(CAML.FieldValue("FileDirRef", FieldType.Text.ToString("f"), folderRelativeUrl)), CAML.Or( CAML.Eq(CAML.FieldValue("LinkFilename", FieldType.Text.ToString("f"), trimmedFolder)), CAML.Eq(CAML.FieldValue("Title", FieldType.Text.ToString("f"), trimmedFolder)) ) ) , CAML.Eq(CAML.FieldValue("FSObjType", FieldType.Integer.ToString("f"), 1.ToString())) ); var camlQueries = onlineLibrary.SafeCamlClauseFromThreshold(camlClause, defaultLastItemId); foreach (var camlAndValue in camlQueries) { var camlWhereClause = CAML.Where(camlAndValue); var camlQuery = new CamlQuery() { ViewXml = CAML.ViewQuery(ViewScope.RecursiveAll, camlWhereClause, string.Empty, camlViewFields, 5) }; var listItems = onlineLibrary.GetItems(camlQuery); onlineLibrary.Context.Load(listItems); onlineLibrary.Context.ExecuteQueryRetry(); if (listItems.Count() > 0) { folderItem = listItems.FirstOrDefault(); System.Diagnostics.Trace.TraceInformation("Item {0} exists in the destination folder. Skip item creation file.....", folderName); break; } } ; if (folderItem != null) { return(folderItem.Folder); } try { var info = new ListItemCreationInformation(); info.UnderlyingObjectType = FileSystemObjectType.Folder; info.LeafName = trimmedFolder; info.FolderUrl = folderRelativeUrl; folderItem = onlineLibrary.AddItem(info); folderItem["Title"] = trimmedFolder; folderItem.Update(); onlineLibrary.Context.ExecuteQueryRetry(); System.Diagnostics.Trace.TraceInformation("{0} folder Created", trimmedFolder); return(folderItem.Folder); } catch (Exception Ex) { System.Diagnostics.Trace.TraceError("Failed to create or get folder for name {0} MSG:{1}", folderName, Ex.Message); } return(null); }
/// <summary> /// Process the internals of the CmdLet /// </summary> public override void ExecuteCmdlet() { base.ExecuteCmdlet(); // Load email notification list var listInSite = this.ListTitle.GetList(this.ClientContext.Web); // get site and query the list for pending requests var fieldNames = new List <string>() { "ID" }; if (ViewFields != null && ViewFields.Length > 0) { fieldNames.AddRange(ViewFields); } ; var fieldsXml = CAML.ViewFields(fieldNames.Select(s => CAML.FieldRef(s)).ToArray()); var camlWhereClause = string.Empty; var camlWhereConcat = false; if (!string.IsNullOrEmpty(this.OverrideCamlQuery)) { camlWhereConcat = true; camlWhereClause = this.OverrideCamlQuery; } if (StartsWithId > 0) { var camlWhereSubClause = CAML.Geq(CAML.FieldValue("ID", FieldType.Number.ToString("f"), StartsWithId.ToString())); if (camlWhereConcat) { // Wrap in an And Clause camlWhereClause = CAML.And(camlWhereClause, camlWhereSubClause); } else { camlWhereConcat = true; camlWhereClause = camlWhereSubClause; } } if (EndsWithId > 0) { var camlWhereSubClause = CAML.Leq(CAML.FieldValue("ID", FieldType.Number.ToString("f"), EndsWithId.ToString())); if (camlWhereConcat) { // Wrap in an And Clause camlWhereClause = CAML.And(camlWhereClause, camlWhereSubClause); } else { camlWhereConcat = true; camlWhereClause = camlWhereSubClause; } } if (string.IsNullOrEmpty(camlWhereClause)) { throw new Exception("Failed to construct a valid CAML Query."); } try { ListItemCollectionPosition ListItemCollectionPosition = null; var camlQuery = new CamlQuery() { ViewXml = CAML.ViewQuery(ViewScope.RecursiveAll, CAML.Where(camlWhereClause), string.Empty, fieldsXml, 50) }; var ids = new List <int>(); while (true) { camlQuery.ListItemCollectionPosition = ListItemCollectionPosition; var spListItems = listInSite.GetItems(camlQuery); this.ClientContext.Load(spListItems); this.ClientContext.ExecuteQueryRetry(); ListItemCollectionPosition = spListItems.ListItemCollectionPosition; foreach (var spListItem in spListItems) { var s = string.Empty; LogWarning("ListItem [{0}] will be deleted.", spListItem.Id); foreach (var fieldName in fieldNames) { s += string.Format("...[{0}]==[{1}]...", fieldName, spListItem[fieldName]); } LogVerbose("LISTITEM: {0}", s); ids.Add(spListItem.Id); } if (ListItemCollectionPosition == null) { break; } } // enumerate the ids to be deleted and process if -WhatIf (not passed) foreach (var id in ids) { if (this.ShouldProcess(string.Format("ListItem [{0}] now being deleted.", id))) { var spListItem = listInSite.GetItemById(id); spListItem.DeleteObject(); listInSite.Update(); this.ClientContext.ExecuteQueryRetry(); } } } catch (Exception ex) { LogError(ex, "Failed to query list {0} with message {1}", this.ListTitle, ex.Message); } }
/// <summary> /// Execute the cmdlet /// </summary> public override void ExecuteCmdlet() { base.ExecuteCmdlet(); // Initialize logging instance with Powershell logger ITraceLogger logger = new DefaultUsageLogger(LogVerbose, LogWarning, LogError); // Construct the model var SiteComponents = new SiteProvisionerModel() { Lists = new List <SPListDefinition>() }; var ctx = this.ClientContext; var contextWeb = this.ClientContext.Web; ctx.Load(contextWeb, ctxw => ctxw.ServerRelativeUrl, wctx => wctx.Url, ctxw => ctxw.Id); ctx.ExecuteQueryRetry(); var _targetList = Identity.GetList(contextWeb, lctx => lctx.ItemCount, lctx => lctx.EnableFolderCreation, lctx => lctx.RootFolder, lctx => lctx.RootFolder.ServerRelativeUrl, lctx => lctx.RootFolder.Folders); var webUri = new Uri(contextWeb.Url); // Will query the list to determine the last item id in the list var lastItemId = _targetList.QueryLastItemId(); logger.LogInformation("List with item count {0} has a last ID of {1}", _targetList.ItemCount, lastItemId); logger.LogInformation("List has folder creation = {0}", _targetList.EnableFolderCreation); // store the OOTB standard fields var ootbCamlFields = new List <string>() { "Title", "ID", "Author", "Editor", "Created", "Modified" }; // Skip these specific fields var skiptypes = new FieldType[] { FieldType.Invalid, FieldType.Computed, FieldType.ContentTypeId, FieldType.Invalid, FieldType.WorkflowStatus, FieldType.WorkflowEventType, FieldType.Threading, FieldType.ThreadIndex, FieldType.Recurrence, FieldType.PageSeparator, FieldType.OutcomeChoice, FieldType.CrossProjectLink, FieldType.ModStat, FieldType.Error, FieldType.MaxItems, FieldType.Attachments }; // pull a small portion of the list // wire up temporary array var sitelists = new List <SPListDefinition>() { ctx.GetListDefinition(_targetList, ExpandObjects, logger, skiptypes) }; if (sitelists.Any()) { var idx = 0; // lets add any list with NO lookups first var nolookups = sitelists.Where(sl => !sl.ListDependency.Any()); nolookups.ToList().ForEach(nolookup => { logger.LogInformation("adding list {0}", nolookup.ListName); nolookup.ProvisionOrder = idx++; SiteComponents.Lists.Add(nolookup); sitelists.Remove(nolookup); }); // order with first in stack var haslookups = sitelists.Where(sl => sl.ListDependency.Any()).OrderBy(ob => ob.ListDependency.Count()).ToList(); while (haslookups.Count() > 0) { var listPopped = haslookups.FirstOrDefault(); haslookups.Remove(listPopped); logger.LogInformation("popping list {0}", listPopped.ListName); if (listPopped.ListDependency.Any(listField => listPopped.ListName.Equals(listField, StringComparison.InvariantCultureIgnoreCase) || listPopped.InternalName.Equals(listField, StringComparison.InvariantCultureIgnoreCase))) { // the list has a dependency on itself logger.LogInformation("Adding list {0} with dependency on itself", listPopped.ListName); listPopped.ProvisionOrder = idx++; SiteComponents.Lists.Add(listPopped); } else if (listPopped.ListDependency.Any(listField => !SiteComponents.Lists.Any(sc => sc.ListName.Equals(listField, StringComparison.InvariantCultureIgnoreCase) || sc.InternalName.Equals(listField, StringComparison.InvariantCultureIgnoreCase)))) { // no list definition exists in the collection with the dependent lookup lists logger.LogWarning("List {0} depends on {1} which do not exist current collection", listPopped.ListName, string.Join(",", listPopped.ListDependency)); foreach (var dependent in listPopped.ListDependency.Where(dlist => !haslookups.Any(hl => hl.ListName == dlist))) { var sitelist = contextWeb.GetListByTitle(dependent, lctx => lctx.Id, lctx => lctx.Title, lctx => lctx.RootFolder.ServerRelativeUrl); var sitelistDefinition = ctx.GetListDefinition(contextWeb, sitelist, true, logger, skiptypes); haslookups.Add(sitelistDefinition); } haslookups.Add(listPopped); // add back to collection listPopped = null; } else { logger.LogInformation("Adding list {0} to collection", listPopped.ListName); listPopped.ProvisionOrder = idx++; SiteComponents.Lists.Add(listPopped); } } } foreach (var listDefinition in SiteComponents.Lists.OrderBy(ob => ob.ProvisionOrder)) { listDefinition.ListItems = new List <SPListItemDefinition>(); var camlFields = new List <string>(); var listTitle = listDefinition.ListName; var etlList = this.ClientContext.Web.GetListByTitle(listTitle, lctx => lctx.Id, lctx => lctx.ItemCount, lctx => lctx.EnableFolderCreation, lctx => lctx.RootFolder.ServerRelativeUrl); if (ExpandObjects) { // list fields var listFields = listDefinition.FieldDefinitions; if (listFields != null && listFields.Any()) { var filteredListFields = listFields.Where(lf => !skiptypes.Any(st => lf.FieldTypeKind == st)).ToList(); var notInCamlFields = listFields.Where(listField => !ootbCamlFields.Any(cf => cf.Equals(listField.InternalName, StringComparison.CurrentCultureIgnoreCase)) && !skiptypes.Any(st => listField.FieldTypeKind == st)); foreach (var listField in notInCamlFields) { logger.LogInformation("Processing list {0} field {1}", etlList.Title, listField.InternalName); camlFields.Add(listField.InternalName); } } } camlFields.AddRange(ootbCamlFields); var camlViewFields = CAML.ViewFields(camlFields.Select(s => CAML.FieldRef(s)).ToArray()); ListItemCollectionPosition itemPosition = null; var camlQueries = etlList.SafeCamlClauseFromThreshold(2000, CamlStatement, 0, lastItemId); foreach (var camlAndValue in camlQueries) { itemPosition = null; var camlWhereClause = (string.IsNullOrEmpty(camlAndValue) ? string.Empty : CAML.Where(camlAndValue)); var camlQuery = new CamlQuery() { ViewXml = CAML.ViewQuery( ViewScope.RecursiveAll, camlWhereClause, CAML.OrderBy(new OrderByField("ID")), camlViewFields, 500) }; try { while (true) { logger.LogWarning("CAML Query {0} at position {1}", camlWhereClause, (itemPosition == null ? string.Empty : itemPosition.PagingInfo)); camlQuery.ListItemCollectionPosition = itemPosition; var listItems = etlList.GetItems(camlQuery); etlList.Context.Load(listItems); etlList.Context.ExecuteQueryRetry(); itemPosition = listItems.ListItemCollectionPosition; foreach (var rbiItem in listItems) { var itemId = rbiItem.Id; var itemTitle = rbiItem.RetrieveListItemValue("Title"); var author = rbiItem.RetrieveListItemUserValue("Author"); var editor = rbiItem.RetrieveListItemUserValue("Editor"); logger.LogInformation("Title: {0}; Item ID: {1}", itemTitle, itemId); var newitem = new SPListItemDefinition() { Id = itemId, Title = itemTitle, Created = rbiItem.RetrieveListItemValue("Created").ToNullableDatetime(), Modified = rbiItem.RetrieveListItemValue("Modified").ToNullableDatetime() }; if (author != null) { newitem.CreatedBy = new SPPrincipalUserDefinition() { Email = author.ToUserEmailValue(), LoginName = author.ToUserValue(), Id = author.LookupId }; } if (editor != null) { newitem.ModifiedBy = new SPPrincipalUserDefinition() { Email = editor.ToUserEmailValue(), LoginName = editor.ToUserValue(), Id = editor.LookupId }; } if (ExpandObjects) { var fieldValuesToWrite = rbiItem.FieldValues.Where(rfield => !ootbCamlFields.Any(oc => rfield.Key.Equals(oc, StringComparison.CurrentCultureIgnoreCase))); foreach (var rbiField in fieldValuesToWrite) { newitem.ColumnValues.Add(new SPListItemFieldDefinition() { FieldName = rbiField.Key, FieldValue = rbiField.Value }); } } listDefinition.ListItems.Add(newitem); } if (itemPosition == null) { break; } } } catch (Exception ex) { logger.LogError(ex, "Failed to retrieve list item collection"); } } } WriteObject(SiteComponents); }
public void Test() { var categories = new List <string>() { "Platform Support", "Research and Strategy" }; var purposes = new List <string>() { "Application and User Lists", "How To", "Support Information" }; var categoriesExpressions = new List <IExpression>(); foreach (var category in categories) { categoriesExpressions.Add(CAML.Expression().TextField("ContentCategory").EqualTo(category)); } var purposesExpressions = new List <IExpression>(); foreach (var purpose in purposes) { purposesExpressions.Add(CAML.Expression().TextField("ContentPurpose").EqualTo(purpose)); } var caml = CAML.Where() .All( CAML.Expression().Any(categoriesExpressions.ToArray()), CAML.Expression().Any(purposesExpressions.ToArray()) ) .ToString(); string expected = @"<Where> <And> <Or> <Eq> <FieldRef Name=""ContentCategory"" /> <Value Type=""Text"">Platform Support</Value> </Eq> <Eq> <FieldRef Name=""ContentCategory"" /> <Value Type=""Text"">Research and Strategy</Value> </Eq> </Or> <Or> <Eq> <FieldRef Name=""ContentPurpose"" /> <Value Type=""Text"">Application and User Lists</Value> </Eq> <Or> <Eq> <FieldRef Name=""ContentPurpose"" /> <Value Type=""Text"">How To</Value> </Eq> <Eq> <FieldRef Name=""ContentPurpose"" /> <Value Type=""Text"">Support Information</Value> </Eq> </Or> </Or> </And> </Where>"; Assert.AreEqual(Beautify.Xml(expected), Beautify.Xml(caml)); }
/// <summary> /// Returns the parent item ID /// </summary> /// <param name="cContext"></param> /// <param name="ItemName"></param> /// <param name="ParentListColumn"></param> /// <param name="logger">diagnostics logger</param> /// <returns></returns> static int GetParentItemID(ClientContext cContext, dynamic ItemName, SPFieldDefinitionModel ParentListColumn, ITraceLogger logger) { int nReturn = -1; var parentListName = string.Empty; var parentListColumnName = string.Empty; NativeFieldLookupValue lookupValue = null; try { string itemJsonString = ItemName.ToString(); Newtonsoft.Json.Linq.JObject jobject = Newtonsoft.Json.Linq.JObject.Parse(itemJsonString); lookupValue = jobject.ToObject <NativeFieldLookupValue>(); parentListName = ParentListColumn.LookupListName; parentListColumnName = ParentListColumn.LookupListFieldName; logger.LogInformation("Start GetParentItemID {0} for column {1}", parentListName, parentListColumnName); Web wWeb = cContext.Web; var lParentList = cContext.Web.GetListByTitle(parentListName, lctx => lctx.Id, lctx => lctx.Title); var camlQuery = new CamlQuery() { ViewXml = CAML.ViewQuery( CAML.Where( CAML.Eq( CAML.FieldValue(parentListColumnName, FieldType.Text.ToString("f"), lookupValue.LookupValue)) ), string.Empty, 10 ) }; ListItemCollectionPosition itemPosition = null; while (true) { var collListItem = lParentList.GetItems(camlQuery); cContext.Load(collListItem, lictx => lictx.ListItemCollectionPosition); cContext.ExecuteQueryRetry(); itemPosition = collListItem.ListItemCollectionPosition; foreach (var oListItem in collListItem) { nReturn = oListItem.Id; break; } // we drop out of the forloop above but if we are paging do we want to skip duplicate results if (itemPosition == null) { break; } } logger.LogInformation("Complete GetParentItemID {0} resulted in ID => {1}", parentListName, nReturn); } catch (Exception ex) { logger.LogError(ex, "Failed to query lookup value {0}", ex.Message); } return(nReturn); }
public override void ExecuteCmdlet() { base.ExecuteCmdlet(); var objects = new List <SPWorkflowInstance>(); var FieldDefinitions = new List <SPFieldDefinitionModel> { new SPFieldDefinitionModel(FieldType.Boolean) { FieldGuid = new Guid("da2872c4-e9b6-4804-9837-6e9dd85ecd7e"), InternalName = FieldBoolean_RestartWorkflow, Description = "RestartWorkflow provides a way to identify items that should be restarted.", Title = FieldBoolean_RestartWorkflow, MaxLength = 255, DefaultValue = "No" } }; var SelectedWeb = this.ClientContext.Web; Ilogger = new DefaultUsageLogger( (string msg, object[] margs) => { LogVerbose(msg, margs); }, (string msg, object[] margs) => { LogWarning(msg, margs); }, (Exception ex, string msg, object[] margs) => { LogError(ex, msg, margs); }); var list = List.GetList(SelectedWeb, lctx => lctx.Id, lctx => lctx.Title); var workflowSubscriptionId = new List <Guid>(); if (!string.IsNullOrEmpty(WorkflowName)) { var servicesManager = new WorkflowServicesManager(ClientContext, SelectedWeb); var subscriptionService = servicesManager.GetWorkflowSubscriptionService(); var subscriptions = subscriptionService.EnumerateSubscriptionsByList(list.Id); ClientContext.Load(subscriptions); ClientContext.ExecuteQueryRetry(); subscriptions.Where(subs => subs.Name == WorkflowName).Select(s => s.Id).ToList().ForEach(subscriptionId => { workflowSubscriptionId.Add(subscriptionId); }); } // Check if the field exists var viewFields = new string[] { "Id", "Title", FieldBoolean_RestartWorkflow }; var internalFields = new List <string>(); internalFields.AddRange(FieldDefinitions.Select(s => s.InternalName)); try { var checkFields = list.GetFields(internalFields.ToArray()); } catch (Exception ex) { Ilogger.LogError(ex, "Failed to retreive the fields {0}", ex.Message); foreach (var field in FieldDefinitions) { // provision the column var provisionedColumn = list.CreateListColumn(field, Ilogger, null); if (provisionedColumn != null) { internalFields.Add(provisionedColumn.InternalName); } } } var view = View.GetView(list); var internalViewFieldXml = new List <string>() { CAML.FieldRef("Id") }; foreach (var vfield in view.ViewFields.Where(w => !w.Equals("ID", StringComparison.CurrentCultureIgnoreCase))) { internalViewFieldXml.Add(CAML.FieldRef(vfield)); } var itemIds = new List <int>(); var viewCaml = new CamlQuery() { ViewXml = CAML.ViewQuery(ViewScope.RecursiveAll, view.ViewQuery, string.Empty, CAML.ViewFields(internalViewFieldXml.ToArray()), view.RowLimit.ToString().ToInt32(5)), ListItemCollectionPosition = null }; do { var items = list.GetItems(viewCaml); this.ClientContext.Load(items, ftx => ftx.ListItemCollectionPosition, ftx => ftx.Include(ftcx => ftcx.Id, ftcx => ftcx.ParentList.Id, ftcx => ftcx[FieldBoolean_RestartWorkflow])); this.ClientContext.ExecuteQueryRetry(); viewCaml.ListItemCollectionPosition = items.ListItemCollectionPosition; foreach (var item in items) { // Load ParentList ID to Pull Workflow Instances var allinstances = SelectedWeb.GetWorkflowInstances(item); if (allinstances.Any()) { foreach (var instance in allinstances) { objects.Add(new SPWorkflowInstance(instance, item.Id)); } itemIds.Add(item.Id); } } }while (viewCaml.ListItemCollectionPosition != null); var rowprocessed = itemIds.Count(); if (rowprocessed > 0 && this.ShouldProcess($"Setting Restart Flag for {rowprocessed} items")) { var rowdx = 0; var totaldx = rowprocessed; foreach (var itemId in itemIds) { rowdx++; totaldx--; var wfItem = list.GetItemById(itemId); list.Context.Load(wfItem); wfItem[FieldBoolean_RestartWorkflow] = true; wfItem.SystemUpdate(); if (rowdx >= 50 || totaldx <= 0) { list.Context.ExecuteQueryRetry(); Ilogger.LogInformation($"Processing {rowprocessed} rows; Persisted {rowdx} rows; {totaldx} remaining"); rowdx = 0; } } var cancelDirty = false; var viewFieldXml = CAML.ViewFields(viewFields.Select(s => CAML.FieldRef(s)).ToArray()); var terminatedWFCaml = new CamlQuery() { ViewXml = CAML.ViewQuery(ViewScope.RecursiveAll, CAML.Where(CAML.Eq(CAML.FieldValue(FieldBoolean_RestartWorkflow, FieldType.Boolean.ToString("f"), 1.ToString()))), string.Empty, viewFieldXml, 100), ListItemCollectionPosition = null }; do { var items = list.GetItems(terminatedWFCaml); list.Context.Load(items, ftx => ftx.ListItemCollectionPosition, ftx => ftx.Include(ftcx => ftcx.Id, ftcx => ftcx.ParentList.Id, ftcx => ftcx[FieldBoolean_RestartWorkflow])); list.Context.ExecuteQueryRetry(); terminatedWFCaml.ListItemCollectionPosition = items.ListItemCollectionPosition; rowdx = 0; totaldx = items.Count(); foreach (var item in items) { rowdx++; totaldx--; var itemId = item.Id; var allinstances = SelectedWeb.GetWorkflowInstances(item); foreach (var instance in allinstances) { var instanceId = instance.Id; var msg = $"List Item {itemId} => Cancelling subscription {instance.WorkflowSubscriptionId} instance Id {instanceId}"; Ilogger.LogWarning(msg); cancelDirty = true; instance.CancelWorkFlow(); } if (cancelDirty && (rowdx >= 50 || totaldx <= 0)) { list.Context.ExecuteQueryRetry(); Ilogger.LogInformation($"Processing {rowprocessed} rows; Persisted {rowdx} rows; {totaldx} remaining"); rowdx = 0; } } }while (terminatedWFCaml.ListItemCollectionPosition != null); } WriteObject(objects, true); }
/// <summary> /// Retrieves or creates the folder as a ListItem /// </summary> /// <param name="onlineLibrary">The target list for the folder</param> /// <param name="destinationFolder">The parent folder of the folter to be created</param> /// <param name="folderName">The folder to be created</param> /// <param name="defaultStartItemId">(OPTIONAL) If the list/library is above the threshold this will be the start index of the caml queries</param> /// <param name="defaultLastItemId">(OPTIONAL) If the list/library is above the threshold this will be the terminating index of the caml queries</param> /// <returns>The listitem as a folder</returns> public static Folder GetOrCreateFolder(this List onlineLibrary, Folder destinationFolder, string folderName, Nullable <int> defaultStartItemId = default(int?), Nullable <int> defaultLastItemId = default(int?)) { if (!onlineLibrary.IsPropertyAvailable(lctx => lctx.BaseType)) { onlineLibrary.Context.Load(onlineLibrary, lctx => lctx.BaseType, lctx => lctx.BaseTemplate); onlineLibrary.Context.ExecuteQueryRetry(); } if (!destinationFolder.IsPropertyAvailable(fctx => fctx.ServerRelativeUrl) || !destinationFolder.IsObjectPropertyInstantiated(fctx => fctx.Folders)) { destinationFolder.Context.Load(destinationFolder, afold => afold.ServerRelativeUrl, afold => afold.Folders); destinationFolder.Context.ExecuteQueryRetry(); } ListItem folderItem = null; var folderRelativeUrl = destinationFolder.ServerRelativeUrl; var camlFields = new string[] { "Title", "ID" }; var camlViewFields = CAML.ViewFields(camlFields.Select(s => CAML.FieldRef(s)).ToArray()); // Remove invalid characters var trimmedFolder = HelperExtensions.GetCleanDirectory(folderName, string.Empty); var linkFileFilter = CAML.Eq(CAML.FieldValue("Title", FieldType.Text.ToString("f"), trimmedFolder)); if (onlineLibrary.BaseType == BaseType.DocumentLibrary) { linkFileFilter = CAML.Or( linkFileFilter, CAML.Eq(CAML.FieldValue("LinkFilename", FieldType.Text.ToString("f"), trimmedFolder))); } var camlClause = CAML.And( CAML.Eq(CAML.FieldValue("FileDirRef", FieldType.Text.ToString("f"), folderRelativeUrl)), CAML.And( CAML.Eq(CAML.FieldValue("FSObjType", FieldType.Integer.ToString("f"), 1.ToString())), linkFileFilter ) ); var camlQueries = onlineLibrary.SafeCamlClauseFromThreshold(1000, camlClause, defaultStartItemId, defaultLastItemId); foreach (var camlAndValue in camlQueries) { ListItemCollectionPosition itemPosition = null; var camlWhereClause = CAML.Where(camlAndValue); var camlQuery = new CamlQuery() { ViewXml = CAML.ViewQuery( ViewScope.RecursiveAll, camlWhereClause, string.Empty, camlViewFields, 5) }; camlQuery.ListItemCollectionPosition = itemPosition; var listItems = onlineLibrary.GetItems(camlQuery); onlineLibrary.Context.Load(listItems, lti => lti.ListItemCollectionPosition); onlineLibrary.Context.ExecuteQueryRetry(); if (listItems.Count() > 0) { folderItem = listItems.FirstOrDefault(); System.Diagnostics.Trace.TraceInformation("Folder {0} exists in the destination folder. Skip folder creation .....", folderName); break; } } ; if (folderItem != null) { return(folderItem.Folder); } try { var info = new ListItemCreationInformation { UnderlyingObjectType = FileSystemObjectType.Folder, LeafName = trimmedFolder, FolderUrl = folderRelativeUrl }; folderItem = onlineLibrary.AddItem(info); folderItem["Title"] = trimmedFolder; folderItem.Update(); onlineLibrary.Context.ExecuteQueryRetry(); System.Diagnostics.Trace.TraceInformation("{0} folder Created", trimmedFolder); return(folderItem.Folder); } catch (Exception Ex) { System.Diagnostics.Trace.TraceError("Failed to create or get folder for name {0} MSG:{1}", folderName, Ex.Message); } return(null); }
public override void ExecuteCmdlet() { base.ExecuteCmdlet(); var SelectedWeb = this.ClientContext.Web; ilogger = new DefaultUsageLogger( (string msg, object[] margs) => { LogDebugging(msg, margs); }, (string msg, object[] margs) => { LogWarning(msg, margs); }, (Exception ex, string msg, object[] margs) => { LogError(ex, msg, margs); }); var list = List.GetList(SelectedWeb); SelectedWeb.Context.Load(list, lctx => lctx.Id); SelectedWeb.Context.ExecuteQueryRetry(); var workflowSubscriptionId = default(Nullable <Guid>); if (!string.IsNullOrEmpty(WorkflowName)) { var servicesManager = new WorkflowServicesManager(ClientContext, SelectedWeb); var subscriptionService = servicesManager.GetWorkflowSubscriptionService(); var subscriptions = subscriptionService.EnumerateSubscriptionsByList(list.Id); //foreach (WorkflowSubscription subs1 in subscriptions) //{ // if (subs1.Name == WorkflowName) { ClientContext.Load(subs1); } //} ClientContext.Load(subscriptions); ClientContext.ExecuteQueryRetry(); if (subscriptions.Any(subs => subs.Name == WorkflowName)) { var subscription = subscriptions.FirstOrDefault(subs => subs.Name == WorkflowName); workflowSubscriptionId = subscription.Id; } } // Check if the field exists var viewFields = new string[] { "Id", "Title", WorkflowColumnName }; var viewFieldXml = CAML.ViewFields(viewFields.Select(s => CAML.FieldRef(s)).ToArray()); var internalFields = new List <string>(); internalFields.AddRange(viewFields); try { var checkFields = list.GetFields(internalFields.ToArray()); } catch (Exception ex) { LogError(ex, $"Failed to retreive the fields {string.Join(";", viewFields)} with Msg {ex.Message}"); return; } var itemIds = new List <int>(); var viewCaml = new CamlQuery() { ViewXml = CAML.ViewQuery( ViewScope.RecursiveAll, CAML.Where(CAML.Neq(CAML.FieldValue(WorkflowColumnName, FieldType.WorkflowStatus.ToString("f"), WorkflowStatus.Completed.ToString("D")))), string.Empty, viewFieldXml, 100) }; ListItemCollectionPosition itemPosition = null; while (true) { viewCaml.ListItemCollectionPosition = itemPosition; var items = list.GetItems(viewCaml); list.Context.Load(items); list.Context.ExecuteQueryRetry(); itemPosition = items.ListItemCollectionPosition; foreach (var item in items) { itemIds.Add(item.Id); } if (itemPosition == null) { break; } } // Workflow status to re-start! var workflowStati = new List <Microsoft.SharePoint.Client.WorkflowServices.WorkflowStatus>() { Microsoft.SharePoint.Client.WorkflowServices.WorkflowStatus.Started, Microsoft.SharePoint.Client.WorkflowServices.WorkflowStatus.Suspended, Microsoft.SharePoint.Client.WorkflowServices.WorkflowStatus.Invalid }; foreach (var itemId in itemIds) { // Retreive the ListItem var item = list.GetItemById("" + itemId); list.Context.Load(item, ictx => ictx.Id, ictx => ictx.ParentList.Id); list.Context.ExecuteQueryRetry(); // Variables for processing var subscriptionIds = new List <Guid>(); var allinstances = SelectedWeb.GetWorkflowInstances(item); var terminationInstances = allinstances.Where(instance => workflowStati.Any(ws => ws == instance.Status) && (!workflowSubscriptionId.HasValue || (!workflowSubscriptionId.HasValue && instance.WorkflowSubscriptionId == workflowSubscriptionId))).ToList(); // Cancel the existing failed workflow instances foreach (var instance in terminationInstances) { var instanceId = instance.Id; subscriptionIds.Add(instance.WorkflowSubscriptionId); var msg = string.Format("List Item {0} => Cancelling subscription {1} instance Id {2}", itemId, instance.WorkflowSubscriptionId, instanceId); if (ShouldProcess(msg)) { instance.CancelWorkFlow(); LogWarning("List Item {0} => Cancelled subscription {1} instance Id {2}", itemId, instance.WorkflowSubscriptionId, instanceId); } } // Instantiate the workflow subscription foreach (var subscriptionId in subscriptionIds) { var msg = string.Format("List Item {0} => Start workflow subscription id {1}", itemId, subscriptionId); if (ShouldProcess(msg)) { var instanceId = item.StartWorkflowInstance(subscriptionId, new Dictionary <string, object>()); LogWarning("List Item {0} => Successfully restarted subscription {1} with new instance Id {2}", itemId, subscriptionId, instanceId); } } // Retreive the Item workflow instances and print to the console var instances = SelectedWeb.GetWorkflowInstances(item); foreach (var instance in instances) { LogVerbose("List Item {0} => Instance {1} => Status {2} => WF Status {3} => Created {4} => LastUpdated {5} => Subscription {6}", itemId, instance.Id, instance.Status, instance.UserStatus, instance.InstanceCreated, instance.LastUpdated, instance.WorkflowSubscriptionId); } } }