SPSite.GetChanges method (SPChangeQuery)

Returns a collection of changes from the change log filtered by the specified query.

Namespace:  Microsoft.SharePoint
Assembly:  Microsoft.SharePoint (in Microsoft.SharePoint.dll)

Syntax

'Declaration
Public Function GetChanges ( _
    query As SPChangeQuery _
) As SPChangeCollection
'Usage
Dim instance As SPSite
Dim query As SPChangeQuery
Dim returnValue As SPChangeCollection

returnValue = instance.GetChanges(query)
public SPChangeCollection GetChanges(
    SPChangeQuery query
)

Parameters

Return value

Type: Microsoft.SharePoint.SPChangeCollection
A collection of SPChange objects that represent changes. You can adjust the maximum size of the collection by setting the FetchLimit property of the SPChangeQuery object that you pass in the query parameter.

Remarks

Use this method to filter changes when you are interested only in changes to particular objects, rather than all objects, or only in selected actions on particular objects. For more information, see the documentation for the SPChangeQuery class.

Note

By default, the change log retains data for 60 days. You can configure the retention period by setting the ChangeLogRetentionPeriod property.

Examples

The following example is a console application that queries the change log for all add, delete, and update operations on content types in a site collection. Note that the application calls the GetChanges method in a loop, fetching changes in batches until all changes have been retrieved.

using System;
using Microsoft.SharePoint;

namespace Test
{
   class ConsoleApp
   {
      static void Main(string[] args)
      {
         using (SPSite siteCollection = new SPSite("https://localhost"))
         {
            using (SPWeb webSite = siteCollection.RootWeb)
            {
               // Construct a query.
               SPChangeQuery query = new SPChangeQuery(false,  // limit object types
                                                       false); // limit change types

               // object type 
               query.ContentType = true;

               // change types 
               query.Add = true;
               query.Delete = true;
               query.Update = true;

               long total = 0;
               while (true)
               {
                  SPChangeCollection changes = siteCollection.GetChanges(query);

                  total += changes.Count;

                  foreach (SPChangeContentType change in changes)
                  {
                     // Get the content type (if it still exists).
                     SPContentType contentType = 
                         webSite.AvailableContentTypes[change.Id];

                     // The change might have been to delete the content type.
                     string contentTypeName;
                     if (contentType == null)
                        contentTypeName = "Unknown";
                     else
                        contentTypeName = contentType.Name;

                     Console.WriteLine("\n{0} content type was changed on {1}.", 
                                       contentTypeName, change.Time.ToShortDateString());
                     Console.WriteLine("Type of change: {0}", change.ChangeType.ToString());
                  }

                  // Break out of loop if we have the last batch.
                  if (changes.Count < query.FetchLimit)
                     break;
                  // Otherwise, go get another batch.
                  query.ChangeTokenStart = changes.LastChangeToken;
               }

               Console.WriteLine("\nTotal changes = {0:#,#}", total);


            }
         }
         Console.Write("\nPress ENTER to continue...");
         Console.ReadLine();
      }
   }
}
Imports System
Imports Microsoft.SharePoint

Module ConsoleApp
   Sub Main()
      Using siteCollection As SPSite = New SPSite("https://localhost")
         Using webSite As SPWeb = siteCollection.RootWeb

            ' Construct a query.
            Dim query As New SPChangeQuery(False, False)

            ' object type
            query.ContentType = True

            ' change types 
            query.Add = True
            query.Delete = True
            query.Update = True

            Dim total As Long = 0
            While True
               Dim changes As SPChangeCollection = siteCollection.GetChanges(query)

               total += changes.Count

               For Each change As SPChangeContentType In changes

                  ' Get the content type (if it still exists).
                  Dim contentType As SPContentType = _
                      webSite.AvailableContentTypes(change.Id)

                  ' The change might have been to delete the content type.
                  Dim contentTypeName As String
                  If contentType Is Nothing Then
                     contentTypeName = "Unknown"
                  Else
                     contentTypeName = contentType.Name
                  End If

                  Console.WriteLine(vbCrLf + "{0} content type was changed on {1}.", _
                                    contentTypeName, change.Time.ToShortDateString())
                  Console.WriteLine("Type of change: {0}", change.ChangeType.ToString())

               Next change

               ' Break out of the loop when we fetch the last batch of changes.
               If changes.Count < query.FetchLimit Then
                  Exit While
               End If

               ' Go get another batch of changes starting where we left off.
               query.ChangeTokenStart = changes.LastChangeToken

            End While

            Console.WriteLine(vbCrLf + "Total changes = {0:#,#}", total)

         End Using
      End Using
      Console.Write(vbCrLf + "Press ENTER to continue...")
      Console.ReadLine()
   End Sub
End Module

See also

Reference

SPSite class

SPSite members

GetChanges overload

Microsoft.SharePoint namespace

SPChangeQuery

Other resources

Using the Change Log