LINQ GroupBy además de seleccionar el tipo de elemento de regresar en lugar de valor

votos
0

Novato C #, veterano de DBA y nuevo a LINQ. Estoy tratando de entender por qué una cláusula de selección, dentro del contexto de un GroupBy, está volviendo un nombre de tipo (en este caso System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [CasesReportParser.Requisition, System.String]) en lugar de una valor del campo.

Mi confusión definitiva, creo, es genéricamente cómo incluir campos adicionales en consecuencia GroupBy con esos campos adicionales que no están agrupados en uno (no se pongan de otra G.KEY).

Aquí está el código y es el condicional, ExamType, en la última línea que devuelve el nombre del tipo. Gracias.

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())
                });
Publicado el 19/12/2018 a las 14:15
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
3

Es posible que desee añadir .First, ya que está regresando de una colección.

g.Select(l => l.ExamType).First().ToString()
Respondida el 19/12/2018 a las 14:18
fuente por usuario

votos
0

En primer SelectIndiferente devolver cualquier elementos en absoluto. De hecho, ni siquiera se devuelve una colección , sino un iterador que puede iterar sobre una colección.

Así que simplemente llamando Selecten una colección postulante no hacer nada en absoluto, solamente llamando MoveNexten ese iterador llevará a cabo la consulta. Esto se puede hacer de muchas maneras difefrent, uno de los cuales está llamando Firsto FirstOrDefault, lo que parece que puedes usar en su caso. Firstserá una excepción si se devuelve ningún elemento, FirstOrDefaultsin embargo devolverá el valor predeterminado para el tipo de iterador ( nullpara referencia tipos).

Habiendo dicho esto es probable que tenga esto en su Select:

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

Como FirstOrDefaultpuede regresar nullyou'd obtener una NullReferenceException, por lo que se debe utilizar el ? .- operador .

Respondida el 19/12/2018 a las 14:43
fuente por usuario

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