List & Label über NEST in C# mit Elasticsearch verbinden

Einleitung

NEST bietet bequem die Möglichkeit, auf Elasticsearch-Daten zuzugreifen.

List & Label kann einfach an NEST Ergebnisobjekte gebunden werden und so auch Daten aus Elasticsearch-Clustern verarbeiten.

Durchführung

Da das Ergebnisobjekt recht komplex aufgebaut ist, sollten Sie in einem explizit erzeugten ObjectDataProvider einige Eigenschaften setzen. So sieht der Anwender nur das, was auch wirklich benötigt wird. Ein Minimalbeispiel (das Daten von diesem Beispiel verwendet) könnte so aussehen:

using (ListLabel LL = new ListLabel())
{
    // Daten von Elasticsearch lesen
    var response = ConnectionToES.EsClient().Search<DocumentAttributes>(s => s
    .Index("disney")
    .From(0)
    .Size(1000)
    .Query(q => q.MatchAll()));

    // Objektdatenprovider mit optimalen Einstellungen erzeugen
    ObjectDataProvider provider = new ObjectDataProvider(response.Hits)
    {
        // Struktur so flach wie möglich halten
        MaximumRecursionDepth = 1,

        // Klar lesbaren, anwenderfreundlichen Namen für die Tabelle wählen
        RootTableName = "Data"
    };

    // Eventhandler registrieren, um das Parsingverhalten weiter zu beeinflussen
    provider.HandleEnumerableProperty += Provider_HandleEnumerableProperty;

    // An die Daten binden und Designer aufrufen
    LL.DataSource = provider;
    LL.Design();
}

Mit dem HandleEnumerableProperty Ereignis des List & Label ObjectDataProvider können Sie alle nicht benötigten Strukturen unterdrücken:

private void Provider_HandleEnumerableProperty(object sender, HandleEnumerablePropertyEventArgs e)
{
    // Keine weiteren Pfade akzeptieren
    e.CancelRecursion = true;
}

Ergebnis

Die Daten stehen dann im Data > Source Ordner im Designer zur Verfügung:

image

und können z.B. in einer einfachen Tabelle angezeigt werden:

image

Natürlich können Sie auch die Ergebnisobjekte in typisierte Objekte umwandeln und sich so die Sonderbehandlung wie oben sparen - das ist im Code dann aber etwas aufwändiger.