Sonntag, Dezember 15, 2019

LINQ group by-Abfrage verwenden reflektiert Eigenschaft name

Will ich füllen Sie ein drop-down mit den öffentlichen Eigenschaften eines bestimmten Objekts, das habe ich fein gemacht. Aber jetzt, wenn der Benutzer wählt den Wert aus dem dropdown, ich will es zu der Gruppe der DB-Tabelle, die Ergebnisse nach dieser Spalte. Ich habe versucht mit LINQ, aber ich kann nur herausfinden, wie man explizit die Gruppe durch eine Instanz-Variablen-Eigenschaft, die nicht durch eine Reflexion Eigenschaft. Das ist meine Methode – der parameter ist der string, der den Namen der Eigenschaft an. ZB, es wird „Land“, wenn der Nutzer will, um group by Kunde.Land, es wird „State“, wenn der Nutzer will, um group by Kunde.Zustand. Aber im moment muss ich hart codiert Gruppe von „Staat“, da ich nicht herausfinden, wie die Verwendung der string-Wert übergeben, mit meiner LINQ-Abfrage

private void DisplayReportAction(string category)
{
    if (!string.IsNullOrEmpty(category))
    {
        SelectedCategory = category;
        _summaries.Clear();

        foreach (var custGroup in _customerInterface.CustomerInterface.GetAllCustomers().GroupBy(c => c.State)
            .Select(group => new
                                 {
                                     Category = group.Key,
                                     Count = group.Count()
                                 })
                                 .OrderBy(x => x.Category))
        {
            _summaries.Add(new CustomerReportSummaryViewModel(custGroup.Category, custGroup.Count));
        }

        ReportVisibility = Visibility.Visible;
    }
}
InformationsquelleAutor NZJames | 2013-10-23

2 Kommentare

  1. 15

    Können Sie mithilfe von Reflektion, wenn Sie mit LINQ to Objects, zum Beispiel diese:

    _customerInterface.CustomerInterface.GetAllCustomers()
         .GroupBy(c => c.GetType().GetProperty(category).GetValue(c, null))

    Wenn Sie mithilfe von Linq To Sql dann eine alternative ist die Verwendung von dynamischen Abfragen, prüfen Sie diesen link

    http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

    • Dies funktioniert gut mit einer Modifikation. Der obige code wird zurückgeben, das property-Objekt, die, wenn Sie der Gruppe durch den Namen der Eigenschaft, bekommen Sie alles wieder unter einem einzigen Eimer mit dem Etikett der name der Eigenschaft. Damit dies funktioniert, müssen Sie die group by-Klausel „.GroupBy(c => c.GetType().GetProperty(Kategorie).GetValue(c, null))“
    • Ich sehe, Sie haben Recht, die Aktualisierung, die Antwort, danke!
  2. 3

    Können Sie bauen-Ausdruck dynamisch:

        Expression<Func<Customer,T>> buildExpression<T>(string category)
        {
            //First build parameter of lambda ( 'c =>' part of expression)
            ParameterExpression param = Expression.Parameter(typeof(Customer), "c");
            //Then body of expression : ' => c.category'
            Expression<Func<Customer, T>> exp = Expression.Lambda<Func<Customer, T>>(Expression.Property(param, category), param);
            return exp;
        }

    Und schließlich rufen

    _customerInterface.CustomerInterface.GetAllCustomers()
        .GroupBy(buildExpression(category))

    EDIT:
    Gut, sorry, Sie noch haben, um zu wissen, die Art der Immobilie zu geben, T-Typ-parameter zu buildExpression Funktion

    Gibt es Möglichkeiten, dies zu tun, zum Beispiel GetProperty(category).PropertyType und rufen Sie dann MakeGenericMethod auf GetType().GetMethod("buildExpression<>"), aber dies erfordert ein wenig mehr Arbeit.
    Wie auch immer, Sie müssen einen Weg finden, zu bauen CustomerReportSummaryViewModel von diesem Typ.

    Ich weiß nicht, Ihren Fall, aber Sie vielleicht alle Kategorien Eigenschaften sind von der gleichen Art, so könnte man hard-code ?

    Wenn Sie interessiert sind, und nicht finden können, eine richtige Weg, es zu tun lassen Sie mich wissen, ich werde versuchen, schreiben Sie eine passende Lösung.

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...