Linq groupby und wählen Sie Elementtyp Rückkehr eher als Wert

stimmen
0

Novice C #, veteran DBA und ganz neu in LINQ. Ich versuche, warum eine select-Klausel, in Zusammenhang mit einer groupBy zu verstehen, ist eine Typname Rückkehr (in diesem Fall „System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [CasesReportParser.Requisition, System.String]“) eher als ein Feldwert.

Meine ultimative Verwirrung, glaube ich, ist generisch, wie mit diesen zusätzlichen Feldern in einem groupBy Ergebnis zusätzlicher Felder, um nicht auf (sonst nicht in g.Key verfügbar) gruppiert werden.

Hier ist der Code, und es ist die bedingte, ExamType, in der letzten Zeile, die den Typnamen zurückkehrt. Vielen Dank.

var ListFinal = rows
                .GroupBy(l => new { ExamDate = ParseDate(l.ExamDate), l.PatientID, l.PatientFirst, l.PatientLast, l.Birthdate, l.SiteName })
                .Select(g => new {
                    //ExamDate = g.Select(l => l.ExamDate),//.ToString().Substring(0,10), //.ToString().Split(' ')[0]
                    ExamDate = g.Key.ExamDate,
                    PatientID = g.Key.PatientID,
                    PatientFirst = g.Key.PatientFirst,
                    PatientLast = g.Key.PatientLast,
                    Birthdate = g.Key.Birthdate,
                    SiteName = g.Key.SiteName,
                    ReqCount = g.Select(l => l.RequisitionNumber).Distinct().Count(),
                    ExamCount = g.Select(l => l.ExamID).Distinct().Count(),
                    ExamType = (g.Select(l => l.ExamID).Distinct().Count()>1 ? multiple : g.Select(l => l.ExamType).ToString())
                });
Veröffentlicht am 19/12/2018 um 14:15
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
3

Sie könnten hinzufügen wollen .First, weil es eine Sammlung zurückkehrt.

g.Select(l => l.ExamType).First().ToString()
Beantwortet am 19/12/2018 um 14:18
quelle vom benutzer

stimmen
0

Zunächst SelectPasst nicht zurückkehren alle Elemente überhaupt. In der Tat zurückgibt es nicht einmal eine Sammlung , sondern ein Iterator , der eine Auflistung durchlaufen kann.

So ruft nur Selectauf einer Sammlung won't alles tun , überhaupt, nur ruft MoveNextan diesem Iterator wird die Abfrage durchzuführen. Dies kann in vielen difefrent Arten erfolgen, von denen eine durch den Aufruf Firstoder FirstOrDefault, was scheint , was Sie in Ihrem Fall verwendet werden soll. Firsteine Ausnahme , wenn kein Element werfen zurückgegeben wurde, FirstOrDefaultjedoch wird der Standard-Wert für den Typ des Iterators (Return nullReferenz-Typen).

Nach diesen Worten müssen Sie wahrscheinlich dies in Ihrem Select:

ExamType = g.Select(l => l.ExamID).Distinct().Count() > 1 ? 
                                   "multiple" : 
                                   g.FirstOrDefault(l => l.ExamType)?.ToString()

Wie FirstOrDefaultkann zurückkehren nulldu würdest eine Nullreferenceexception erhalten, weshalb Sie verwenden sollten ? .- Operator .

Beantwortet am 19/12/2018 um 14:43
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more