linq groupby ainsi sélectionner le type d'élément de retour plutôt que la valeur

voix
0

Novice C #, DBA vétéran et flambant neuf à LINQ. J'essaie de comprendre pourquoi une clause select, dans le contexte d'un groupBy, est de retour un nom de type (dans ce cas « System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [CasesReportParser.Requisition, System.String] ») au lieu d'un valeur du champ.

Ma confusion ultime, je crois, est génériquement comment inclure des champs supplémentaires dans un résultat groupBy avec ces champs supplémentaires ne sont pas groupés sur (non autrement disponible en g.Key).

Voici le code et est conditionnel, ExamType, sur la dernière ligne qui retourne le nom du type. Je vous remercie.

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())
                });
Créé 19/12/2018 à 14:15
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
3

Vous pouvez ajouter .First, car il renvoie une collection.

g.Select(l => l.ExamType).First().ToString()
Créé 19/12/2018 à 14:18
source utilisateur

voix
0

D' abord SelectIndifférent Fume retour des éléments du tout. En fait , il ne revient même pas une collection , mais un iterator qui peut itérer sur une collection.

Il suffit donc d' appeler Selectsur une collection de ne le ferai pas faire quoi que ce soit, appeler uniquement MoveNextsur cette iterator effectuera la requête. Cela peut être fait à bien des égards difefrent, dont un est en appelant Firstou FirstOrDefault, ce qui semble ce que vous devez utiliser dans votre cas. Firstjetteront une exception si aucun élément n'a été retourné, FirstOrDefaultmais retournera la valeur par défaut pour le type de iterator ( nullpour les types de référence).

Cela dit , vous avez probablement besoin dans votre Select:

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

Comme FirstOrDefaultpeut revenir DES nullRESULTATS DE PROFESSIONNELS obtenir un NullReferenceException, ce qui est la raison pour laquelle vous devez utiliser le ? .- opérateur .

Créé 19/12/2018 à 14:43
source utilisateur

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