LINQ GroupBy oraz wybrać typ elementu powrocie zamiast wartości

głosy
0

Nowicjusz C #, weteran DBA i nowy do LINQ. Próbuję zrozumieć, dlaczego klauzuli SELECT, w ciągu kontekście GroupBy, wraca do nazwy typu (w tym przypadku „System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [CasesReportParser.Requisition, system.string]”) zamiast wartość pola.

Mój ostateczny zamieszanie, moim zdaniem, jest ogólnie jak zawierać dodatkowe pola w wyniku GroupBy z tych dodatkowych pól nie są zgrupowane na (nie inaczej dostępne w g.Key).

Oto kod i jest warunkowe, ExamType, na ostatniej linii, która powraca nazwę typu. Dziękuję Ci.

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())
                });
Utwórz 19/12/2018 o 14:15
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
3

Warto dodać .First, ponieważ wraca do kolekcji.

g.Select(l => l.ExamType).First().ToString()
Odpowiedział 19/12/2018 o 14:18
źródło użytkownik

głosy
0

Przede Selectdoesnt powrót żadnych elementów w ogóle. W zasadzie to nawet nie zwraca kolekcję , ale iterator , który może iteracyjne nad kolekcji.

Więc po prostu dzwoniąc Selectna won't zbiórki niczego w ogóle, tylko dzwoniąc MoveNextna ten iterator wykona zapytanie. Można to zrobić na wiele sposobów, difefrent z których jedna jest poprzez wywołanie Firstlub FirstOrDefault, co wydaje co trzeba zastosować w danej sprawie. Firstbędzie wyjątek, jeśli został zwrócony żadnego elementu, FirstOrDefaultjednak powróci domyślną wartość dla typu iteracyjnej ( nulldla odniesienia typów).

Powiedziawszy to prawdopodobnie trzeba to w twojej Select:

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

Jak FirstOrDefaultmoże powrócić nullyou'd uzyskać NullReferenceException, dlatego należy użyć ? .- operatora .

Odpowiedział 19/12/2018 o 14:43
źródło użytkownik

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