linq groupby além de selecionar o retorno tipo de elemento, em vez de valor

votos
0

Novice C #, DBA veterano e novo para LINQ. Eu estou tentando entender por que uma cláusula select, dentro do contexto de um groupBy, está retornando um nome de tipo (neste caso System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [CasesReportParser.Requisition, System.String]) em vez de um valor do campo.

Minha confusão final, creio eu, é genericamente como incluir campos adicionais no resultado groupBy com esses campos adicionais não sendo agrupadas em (não de outra forma disponível em g.Key).

Aqui está o código e é a condicional, ExamType, na última linha que está retornando o nome do tipo. Obrigado.

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 19/12/2018 em 14:15
fonte usuário
Em outras línguas...                            


2 respostas

votos
3

Você pode querer adicionar .First, porque ele está retornando uma coleção.

g.Select(l => l.ExamType).First().ToString()
Respondeu 19/12/2018 em 14:18
fonte usuário

votos
0

Antes de Selectretornar Indiferente quaisquer elementos em tudo. Na verdade, nem mesmo retornar uma coleção , mas um iterador que pode iterar sobre uma coleção.

Então, basta chamar Selectem um ganhou't recolha fazer absolutamente nada, apenas a chamar MoveNextem que iterador irá realizar a consulta. Isso pode ser feito de várias maneiras difefrent, um dos quais é chamando Firstou FirstOrDefault, o que parece que você deve usar em seu caso. Firstirá lançar uma exceção se nenhum elemento foi devolvido, FirstOrDefaultno entanto retornará o valor padrão para o tipo do iterador ( nullpara referência tipos).

Dito isto, você provavelmente precisará este em sua Select:

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

Como FirstOrDefaultpode retornar nullvocê'd obter um NullReferenceException, razão pela qual você deve usar o ? .- operador .

Respondeu 19/12/2018 em 14:43
fonte usuário

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