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

Debugger Captura de pantalla

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 de Until de la lista resultante de la selección.

    Aquí tienes la solución:

    En lugar de results.Select(x => x.Until).ToString(), utiliza results.Select(x => x.Until).Last().ToString(). Esto te permitirá obtener el valor correcto de Until de la última instancia del objeto tmpUpdatedWorklog en la lista results.

    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 tipo ulong, pero lo estás convirtiendo a una cadena con ToString(). Esto da como resultado una cadena que representa el tipo del enumerable en lugar del valor real de Until.

    Para obtener el valor de Until como un ulong, puedes usar el operador de selección Select con una expresión lambda que extraiga el valor de Until 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 de Until:

    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