Ich habe diese (XLinq) Abfrage und frage mich, wie es um die Abfragesyntax zu konvertieren:Linq: mit StringComparer mit GroupBy/Distinct in Abfragesyntax
var grouped = doc.Descendants()
.GroupBy(t => t.Element(ns + "GroupingAttr").Value, StringComparer.OrdinalIgnoreCase);
Dies ist die Abfragesyntax ohne StringComparer:
Meine groupby ist ein wenig komplizierter als das, also ziehe ich es vor, den Schlüssel der Gruppe zu verwenden, anstatt eine neue Eigenschaft einzuführen.
Dies ist, was ich versucht habe, aber nicht funktioniert, weil der Schlüssel "let" nicht im Kontext der Auswahl verfügbar ist (Ich habe meine kompliziertere Schlüsseldefinition verwendet, um die Tatsache zu illustrieren, die ich nicht möchte wiederholen Sie diesen Vorgang in der select):
var grouped = from t in doc.Descendants()
let key = ((t.Name != ns + "SomeElementName") ? t.Element(ns + "SomeAttribute") : t.Element(ns + "SomeOtherAttribute")).ElementValueOrDefault("Empty group")
group t by key.ToUpper() into g
select new { Name = key, Items = g };
Am Ende Groß- und Klein nicht wichtig war, weil ich, dass alle Gehäuse die gleichen waren vermuten könnte ...
Verwandte Frage: LINQ Distinct operator ignore case?
Ich wollte das ToUpper nicht verwenden, da ich den Schlüssel später brauche und nicht möchte, dass sie alle in Großbuchstaben geschrieben sind. Wie bereits erwähnt, könnte ich wahrscheinlich einen anonymen Typ erstellen und eine Eigenschaft mit dem gleichen Wert wie der Schlüssel definieren, aber den ursprünglichen Wert verwenden. Ich wollte das nicht machen, weil mein Schlüssel ziemlich kompliziert ist, aber ich kann in diesem Fall ein ... – riezebosch
verwenden In diesem Fall würde ich dann mit der Nicht-Abfragesyntax bleiben. –
Wenn Sie mit ToUpper nur den Gruppierungsschlüssel verwenden, der die Großbuchstabeversion des Schlüssels ist, ist der tatsächliche Schlüssel, der in dem Objekt gespeichert wird, immer noch die ursprüngliche Version des Schlüssels. –