Freigeben über


Filtern von Daten für einfache Anbieter

In einigen Situationen erfordert das Zielreplikat nur eine Teilmenge der Daten, die beim Quellreplikat verfügbar sind. Beispielsweise könnte eine Vertriebsmitarbeiterin ausführliche Produktinformationen nur für solche Produkte benötigen, die sie regelmäßig verkauft. Einfache Anbieter aktivieren Replikate, um Daten zu filtern, indem eine Filterschnittstelle implementiert wird. Durch das Filtern von Daten können Sie Folgendes erreichen:

  • Reduzierung der über das Netzwerk gesendeten Datenmenge

  • Reduzierung des auf dem Replikat erforderlichen Speicherplatzes. Dies ist für Geräte besonders wichtig.

  • Bereitstellung benutzerdefinierter Datenpartitionen für individuelle Replikatanforderungen.

  • Vermeidung oder Eindämmung von Konflikten, da an unterschiedliche Replikate unterschiedliche Datenpartitionen gesendet werden können.

Beachten Sie, dass für einfache Anbieter keine benutzerdefinierten Filter verwendet werden dürfen. Andernfalls kann es zu unerwarteten Ergebnissen kommen. Bei benutzerdefinierten Filtern handelt es sich um Filter, die die CustomFilterInfo-Klasse (für verwalteten Code) oder die ICustomFilterInfo-Schnittstelle (für nicht verwalteten Code) verwenden.

Um Daten zu filtern, verwenden Sie die folgenden Schnittstellen:

Beispiel für verwalteten Code

Im folgenden Codebeispiel werden Schnittstellen zur Filteraushandlung verwendet, um festzulegen, ob ein bestimmter Filter während einer Synchronisierungssitzung verwendet werden soll. Durch Filteraushandlung kann ein Zielanbieter festlegen, dass der Quellenanbieter während der Änderungsenumeration einen oder mehrere Filter verwenden soll. Der Quellenanbieter kann einen Filter zulassen oder ablehnen. Wenn ein Quellenanbieter irgendeinen der angeforderten Filter nicht unterstützt, kann der Zielanbieter entscheiden, alle Daten zu empfangen und die Filterung selbst durchzuführen. Sync Framework ruft die Anbieter zum Aushandeln der Filterverwendung entsprechend auf.

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 = ""

Im folgenden Codebeispiel wird zuerst eine Filteroption von None angegeben. Dies bedeutet, dass Elemente auch dann herausgefiltert werden sollen, wenn sie dem Ziel bereits bekannt sind. Im Codebeispiel wird dann die IsItemInFilterScope-Methode implementiert, die Elemente anhand eines der Elementfeldwerte herausfiltert. Nachdem der Filter definiert wurde, wird im Codebeispiel die UseFilterThisSession-Methode implementiert. Dadurch kann von einer Anwendung festgelegt werden, ob eine Filterung für die jeweilige Sitzung verwendet werden soll.

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

Siehe auch

Konzepte

Implementieren eines benutzerdefinierten einfachen Anbieters
Vorgehensweise: Erstellen eines verwalteten einfachen Anbieters