筛选简单提供程序的数据

在某些情况下,目标副本只要求在源副本上提供的数据的子集。例如,销售人员可能只要求她经常销售的产品的详细产品信息。简单提供程序通过实现筛选接口使副本能够筛选数据。通过筛选数据,可以达到以下目的:

  • 减少通过网络发送的数据量。

  • 减少在副本上需要的存储空间量。这对于设备来说尤其重要。

  • 基于各个副本需求提供自定义数据分区。

  • 避免或减少冲突,因为可以向不同的副本发送不同的数据分区。

请注意,简单提供程序无法使用自定义筛选器,否则可能出现意外结果。自定义筛选器是使用 CustomFilterInfo 类(对于托管代码)或 ICustomFilterInfo 接口(对于非托管代码)的筛选器。

要筛选数据,请使用以下接口:

托管代码示例

以下代码示例使用筛选器协商接口确定在同步会话期间是否应使用特定的筛选器。通过筛选器协商,目标提供程序能够指定源提供程序在变更枚举期间应使用一个或多个筛选器;源提供程序可以接受或拒绝筛选器。如果源提供程序不支持任何请求的筛选器,则目标提供程序可以选择接收所有数据并自己执行筛选。Sync Framework 相应调用提供程序以协商对筛选器的使用。

public bool RequestFilter
{
    set
    {
        _requestFilter = value; 
    }
}
private bool _requestFilter = false;

void IRequestFilteredSync.SpecifyFilter(FilterRequestCallback filterRequest)
{
    // Request a filter only if this provider represents a filtered replica.
    if (_requestFilter)
    {
        if (!filterRequest("TheFilter", FilteringType.CurrentItemsOnly))
        {
            throw new SyncInvalidOperationException("Could not agree on filter.");
        }
    }
}

bool ISupportFilteredSync.TryAddFilter(object filter, FilteringType filteringType)
{
    if (!((string)filter).Equals("TheFilter"))
    {
        throw new Exception("Filter is incorrect");
    }

    // Remember the filter.
    _filter = (string)filter;

    return true;
}
private string _filter = "";
Public WriteOnly Property RequestFilter() As Boolean
    Set(ByVal value As Boolean)
        _requestFilter = value
    End Set
End Property

Private _requestFilter As Boolean = False

Private Sub SpecifyFilter(ByVal filterRequest As FilterRequestCallback) Implements IRequestFilteredSync.SpecifyFilter
    ' Request a filter only if this provider represents a filtered replica.
    If _requestFilter Then
        If Not filterRequest("TheFilter", FilteringType.CurrentItemsOnly) Then
            Throw New SyncInvalidOperationException("Could not agree on filter.")
        End If
    End If
End Sub

Private Function TryAddFilter(ByVal filter As Object, ByVal filteringType As FilteringType) As Boolean Implements ISupportFilteredSync.TryAddFilter
    If Not DirectCast(filter, String).Equals("TheFilter") Then
        Throw New Exception("Filter is incorrect")
    End If

    ' Remember the filter.
    _filter = DirectCast(filter, String)

    Return True
End Function

Private _filter As String = ""

下面的代码示例首先指定 None 的筛选器选项。这意味着项应该首先筛选出来,即使它们对于目标是已知的。该代码示例然后实现 IsItemInFilterScope 方法,该方法基于项字段值之一筛选出项。在定义筛选器后,该代码示例实现 UseFilterThisSession 方法。这使得应用程序可以指定是否应在每个会话的基础上使用筛选。

SimpleSyncProviderFilterOptions IFilteredSimpleSyncProvider.FilterOptions
{
    get
    {
        return SimpleSyncProviderFilterOptions.None;
    }
}

bool IFilteredSimpleSyncProvider.IsItemInFilterScope(ItemFieldDictionary KeyAndVersion)
{
    ulong itemId = (ulong)KeyAndVersion[1].Value;
    ItemData itemData = _store.Get(itemId);
    if (itemData["data"] == "3333")
    {
        return false;
    }

    return true;
}

bool IFilteredSimpleSyncProvider.UseFilterThisSession
{
    get
    {
        // Indicate whether a filter has been requested and agreed upon for this session.
        return ("" != _filter);
    }
}
Private ReadOnly Property FilterOptions() As SimpleSyncProviderFilterOptions Implements IFilteredSimpleSyncProvider.FilterOptions
    Get
        Return SimpleSyncProviderFilterOptions.None
    End Get
End Property

Private Function IsItemInFilterScope(ByVal KeyAndVersion As ItemFieldDictionary) As Boolean Implements IFilteredSimpleSyncProvider.IsItemInFilterScope
    Dim itemId As ULong = KeyAndVersion(1).Value
    Dim data As ItemData = _store.Get(itemId)
    If data("data") Is "3333" Then
        Return False
    End If

    Return True
End Function

Private ReadOnly Property UseFilterThisSession() As Boolean Implements IFilteredSimpleSyncProvider.UseFilterThisSession
    Get
        ' Indicate whether a filter has been requested and agreed upon for this session.
        Return "" Is _filter
    End Get
End Property

请参阅

概念

实现简单自定义提供程序
如何创建托管的简单提供程序