Tenho a seguinte classe para obter uma resposta de API:
[JsonObject]
[Serializable]
public class Root
{
public Metadata metadata { get; set; }
public List<Result> result { get; set; }
}
[JsonObject]
[Serializable]
public class GroupRecord
{
public string groupNumber { get; set; }
}
[JsonObject]
[Serializable]
public class Metadata
{
public int totalCount { get; set; }
public int page { get; set; }
public int pageCount { get; set; }
}
[JsonObject]
[Serializable]
public class Npi
{
public DateTime EffectiveDate { get; set; }
}
[JsonObject]
[Serializable]
public class Result
{
public string Name { get; set; }
public Npi npi { get; set; }
public List<GroupRecord> aGroupRecord { get; set; }
}
Estou tentando obter o resultado que corresponde a um dado groupNumber
e tem o mais recente EffectiveDate
com LINQ.
Aqui está o código do meu aplicativo que pensei que deveria funcionar:
string groupNumber = "SALT"
Root dataObject = response.Content.ReadAsAsync<Root>().Result;
if (dataObject.result.Count >= 1)
{
var result = dataObject.result.Where(x => x.aGroupRecord.Where(a => a.groupNumber == groupNumber).OrderByDescending(x.npi => x.npi.EffectiveDate)).FirstOrDefault();
}
Se a saída for um
Result
, então você quer:Não estou usando
x
como nome de parâmetro para deixar mais claro o que o parâmetro representa:r
para "record" egr
para "groupRecord".Isso pressupõe que, durante o processo de filtragem, você deseja manter qualquer
Record
objeto que tenha pelo menos umGroupRecord
objeto com o número de grupo correspondente.Seu código teve algumas travessuras acontecendo com o
.OrderByDescending(x.npi
. Ele estava anexado aox.aGroupRecord
, mas estava reutilizando uma variável mais acima no escopo.Isso espera um delegado que produza um bool, ou seja, um específico deve
Result
ser incluído no conjunto de dados ou não. Mas você está dando a ele uma lista completa, e isso não é válido. Meu palpite é que você quer:Ou seja, inclua todos os resultados que tenham pelo menos um aGroupRecord que corresponda ao groupNumber.
Você pode então aplicar a ordenação e pegar o primeiro item, ou pode usar a nova função MaxBy:
Se você quiser um GroupRecord com a data efetiva mais alta, você pode introduzir uma tupla para projetar aGroupRecords junto com a data associada: