ich LINQ to EF verwende und die folgende LINQ-Abfrage haben:Mit LINQ, wie habe ich eine Gruppierung durch ein „berechnetes Feld“
var results = (from x in ctx.Items
group x by x.Year into decades
orderby decades.Count() descending
select new { Decade = decades.Key, DecadeCount = decades.Count() });
Also diese Art von bekommt mir, wo ich sein möchte, indem ich die Items nach Jahr und Anzahl der Items in diesem Jahr aufschlüsselt. (d. h. 2001 - 10, 1975 - 15, 2005 - 5, 1976 - 1) Das, was ich wirklich tun möchte, ist es, sie nach zehn Jahren aufzubrechen (d. h. 2000 - 15, 1970 - 16).
Wie hat man ein "berechnetes Feld" im "by" -Teil der Gruppenklausel für eine Linq-Anweisung. Ich denke, was ich will, ist im Grunde so etwas wie:
var results = (from x in ctx.Items
group x by (x => x.Year.Value.ToString().Substring(0, 3) + "0s") into decades
orderby decades.Count() descending
select new { Decade = decades.Key, DecadeCount = decades.Count() });
Oder allgemeiner die Syntax, so dass ich komplizierte Auswertung/Berechnung etwas mehr tun, um die Gruppe, indem Sie auf tun. Irgendwelche Ideen?
EDIT (Update):
(. X => x.Year.Value.ToString() Substring (0, 3) + "0") - funktioniert nicht - „LINQ to Entities nicht Erkennen Sie die Methode 'System.String ToString()', und diese Methode kann nicht in einen Speicherausdruck übersetzt werden. "
(x.Year/10 * 10) - Funktionell arbeitet (danke) - das einzige "Problem" ist, dass die 's' nicht am Ende ist (dh 1970 vs. 1970)
Gibt es Wie auch immer, um eine Funktion in die By-Klausel zu setzen? d.h. Gruppe x durch this.ManipulateYear (x.Year) in Dekaden ... oder ... x => x.Year.Value.ToString(). Substring (0,3) + "0s" ?? Es wäre schön, eine Technik zu haben (zum Beispiel eine Funktion aufzurufen oder einen Lambda-Ausdruck zu verwenden), so dass ich jeden denkbaren Fall abdecken kann.
Nochmals vielen Dank für die Hilfe von allen.
Nein, eine Gruppierung ist bereits ein IEnumerable von IEnumerables (als IGrouping IEnumberable erstreckt). Keine Notwendigkeit für SelectMany hier. –