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:
Verwalteter Code: IFilteredSimpleSyncProvider, IRequestFilteredSync und ISupportFilteredSync
Systemeigener Code: IFilteredSimpleSyncProvider, IRequestFilteredSync und ISupportFilteredSync
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