Partager via


Filtrage de données pour les fournisseurs simples

Dans certaines situations, le réplica de destination n'a besoin que d'un sous-ensemble des données disponibles sur le réplica source. Par exemple, un commercial peut n'avoir besoin des informations détaillées des produits que pour les produits qu'il vend régulièrement. Les fournisseurs simples permettent aux réplicas de filtrer des données en implémentant une interface de filtrage. Le filtrage des données vous permet d'obtenir les résultats suivants :

  • Vous limitez la quantité de données envoyées sur le réseau.

  • Vous limitez la quantité d'espace de stockage nécessaire sur un réplica. Ceci est particulièrement important pour les périphériques.

  • Vous fournissez des partitions de données personnalisées en fonction des besoins des réplicas.

  • Vous évitez ou réduisez les conflits, car différentes partitions de données peuvent être envoyées à différents réplicas.

N'oubliez pas que les fournisseurs simples ne peuvent pas utiliser les filtres personnalisés, sinon des résultats inattendus peuvent se produire. Les filtres personnalisés sont des filtres qui utilisent la classe CustomFilterInfo (pour le code managé) ou l'interface ICustomFilterInfo (pour le code non managé).

Pour filtrer des données, utilisez les interfaces suivantes :

Exemple de code managé

L'exemple de code suivant utilise des interfaces de négociation des filtres pour déterminer si un filtre spécifique doit être utilisé pendant une session de synchronisation. La négociation des filtres permet à un fournisseur de destination de spécifier que le fournisseur de source doit utiliser un ou plusieurs filtres pendant l'énumération des modifications ; le fournisseur de source peut accepter ou rejeter un filtre. Si un fournisseur de source ne prend en charge aucun des filtres demandés, le fournisseur de destination peut choisir de recevoir toutes les données et procéder lui-même au filtrage. Sync Framework appelle les fournisseurs en conséquence pour négocier l'utilisation des filtres.

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

L'exemple de code suivant spécifie en premier lieu l'option de filtre None. Cela signifie que les éléments doivent être filtrés même s'ils sont déjà connus de la destination. L'exemple de code implémente ensuite la méthode IsItemInFilterScope, qui filtre alors des éléments selon l'une des valeurs de champs d'éléments. Après avoir défini le filtre, l'exemple de code implémente la méthode UseFilterThisSession. Cela permet à une application de spécifier si le filtrage doit être utilisé session par session.

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

Voir aussi

Autres ressources

Implémentation d'un fournisseur personnalisé simple

Procédure : créer un fournisseur simple managé