Linq: cómo obtengo el valor de un objeto
Problema:
Trato de mapear todos los temas de los trabajos actualizados desde la fecha "x". La API jira admite solo 1000 elementos: Jira API
Ahora me gustaría conseguir el valor del último x.Until
Pero el valor todavía no es: "System.Linq.Enumerable+SelectListIterator`2[TempusDraft.tmpUpdatedWorklog,System.UInt64]"
¿Dafuq? ¿Por qué? No puedo ver mi error.
¿Y cómo obtengo el valor correcto (mira la imagen)?
¡Muchas gracias y quédate sana!
Clases:
class tmpUpdatedWorklog
{
[JsonPropertyName("values")]
public List Values { get; set; }
[JsonPropertyName("since")]
public ulong Since { get; set; }
[JsonPropertyName("until")]
public ulong Until { get; set; }
[JsonPropertyName("lastPage")]
public bool LastPage { get; set; }
public class worklog
{
[JsonPropertyName("worklogId")]
public long Id { get; set; }
[JsonPropertyName("updatedTime")]
public long updatedTime { get; set; }
}
}
class tmpWorklogRequestModel
{
[JsonPropertyName("ids")]
public List Ids { get; set; }
}
Métodos:
private static async Task> GetUpdatedWorklogs(HttpClient client, List tmpUpdatedWorklogs)
{
var stream = await client.GetStreamAsync($"{JIRA_BASE_URL}worklog/updated?since={DateTimeOffset.UtcNow.AddYears(-2).ToUnixTimeMilliseconds()}");
var result = await JsonSerializer.DeserializeAsync(stream);
tmpUpdatedWorklogs.Add(result);
return tmpUpdatedWorklogs;
}
private static async Task> GetUpdatedWorklogs(HttpClient client, List tmpUpdatedWorklogs, string since)
{
Console.WriteLine(since.ToString());
var stream = await client.GetStreamAsync($"{JIRA_BASE_URL}worklog/updated?since={since}");
var result = await JsonSerializer.DeserializeAsync(stream);
tmpUpdatedWorklogs.Add(result);
return tmpUpdatedWorklogs;
}
Usando:
// other stuff before
private static readonly string JIRA_BASE_URL = "[link]";
static async Task Main(string[] args)
{
using (HttpClient client = new HttpClient())
{
// other stuff before
List tmpUpdatedWorklogs = new List();
var results = await GetUpdatedWorklogs(client, tmpUpdatedWorklogs);
while (!results.Select(x => x.LastPage).Contains(true))
{
// this doesn't work:
// looks like: {JIRA_BASE_URL}worklog/updated?since=System.Linq.Enumerable+SelectListIterator`2[TempusDraft.tmpUpdatedWorklog,System.UInt64]
results = await GetUpdatedWorklogs(client, tmpUpdatedWorklogs, results.Select(x => x.Until).ToString());
}
// other stuff
}
}
Pregunta hecha hace 3 años, 4 meses, 29 días - Por binarybrainiac
3 Respuestas:
-
Usted está llamando a ToString() en el IEnumerable devuelto por el Select-statement. Si entiendo la lógica de su aplicación correctamente (no conozco la API de Jira), debe reemplazar
while (!results.Select(x => x.LastPage).Contains(true)) { // this doesn't work: // looks like: {JIRA_BASE_URL}worklog/updated?since=System.Linq.Enumerable+SelectListIterator`2[TempusDraft.tmpUpdatedWorklog,System.UInt64] results = await GetUpdatedWorklogs(client, tmpUpdatedWorklogs, results.Select(x => x.Until).ToString()); }
con algo como
while (!results.Select(x => x.LastPage).Contains(true)) { // this doesn't work: // looks like: {JIRA_BASE_URL}worklog/updated?since=System.Linq.Enumerable+SelectListIterator`2[TempusDraft.tmpUpdatedWorklog,System.UInt64] results = await GetUpdatedWorklogs(client, tmpUpdatedWorklogs, results.Select(x => x.Until).Last().ToString()); }
(La única diferencia es la última afirmación al final.)
Respondida el Dec 17, 2020 a las 16:56 - por techsavvypro
Votos positivos: 0 | Votos negativos: 0 -
El problema que estás experimentando se debe a que estás tratando de obtener el valor de
results.Select(x => x.Until)
directamente como una cadena, lo cual no te dará el valor deseado. En su lugar, debes utilizar un método apropiado para obtener el valor correcto deUntil
de la lista resultante de la selección.Aquí tienes la solución:
En lugar de
results.Select(x => x.Until).ToString()
, utilizaresults.Select(x => x.Until).Last().ToString()
. Esto te permitirá obtener el valor correcto deUntil
de la última instancia del objetotmpUpdatedWorklog
en la listaresults
.Por lo tanto, la línea relevante de tu código debería quedar así:
csharp results = await GetUpdatedWorklogs(client, tmpUpdatedWorklogs, results.Select(x => x.Until).Last().ToString());
Con este cambio, deberías poder obtener el valor correcto de
Until
y solucionar el problema que estás experimentando. ¡Espero que esta solución te sea útil! ¡Déjame saber si necesitas más ayuda!Respondida el Dec 18, 2020 a las 16:57 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El problema aquí es que
x.Until
es un valor de tipoulong
, pero lo estás convirtiendo a una cadena conToString()
. Esto da como resultado una cadena que representa el tipo del enumerable en lugar del valor real deUntil
.Para obtener el valor de
Until
como unulong
, puedes usar el operador de selecciónSelect
con una expresión lambda que extraiga el valor deUntil
de cada elemento:csharp results = await GetUpdatedWorklogs(client, tmpUpdatedWorklogs, results.Select(x => x.Until).ToString());
Reemplázalo con:
csharp results = await GetUpdatedWorklogs(client, tmpUpdatedWorklogs, results.Select(x => x.Until).Last().ToString());
Esto seleccionará el último valor de
Until
de la lista y lo convertirá a una cadena.Además, también puedes simplificar tu código usando el método
LastOrDefault
para obtener el último valor deUntil
:csharp results = await GetUpdatedWorklogs(client, tmpUpdatedWorklogs, results.LastOrDefault().Until.ToString());
Este código obtendrá el último valor de
Until
de la lista y lo convertirá a una cadena, incluso si la lista está vacía.Respondida el Dec 18, 2020 a las 17:09 - por Gemini
Votos positivos: 0 | Votos negativos: 0