none
Sustituir en consulta de Linq el valor entero de Estado por sus valores contenidos en un Diccionario. RRS feed

  • Pregunta

  • Hola:

    Tengo la siguiente consulta en linq:

    var _ordenes = db.OTrabajos.Where(w => w.EmpresaId == empresaId).OrderByDescending(o => o.Fecha)

    .Select(s => new DGVOrden { ClienteNombre = s.Cliente.Nombre, Estado = s.Estado, Matricula = s.Vehiculo.Matricula,

    Numero = s.Numero, OTrabajoId = s.OTrabajoId, Serie = s.Serie, Total = s.Total }).ToList();

    En "Estado = s.Estado" es el valor entero del Diccionario siguiente y yo lo que quiero es que ponga su valor:

    public static Dictionary<int, string> dicEstadosOrdenes = new Dictionary<int, string>()
            {
                {1, "Pendiete" },
                {2, "Facturada" },
                {3, "Anulada" }
            };

    Y no se como puedo vincular el campo "Estado" de la consulta de Linq para que me de el valor de texto que le corresponda en el diccionario.

    Un Saludo.

    lunes, 13 de agosto de 2018 10:07

Respuestas

  • hola

    podrias definir un linq dentro del select

    var _ordenes = db.OTrabajos
    					.Where(w => w.EmpresaId == empresaId)
    					.OrderByDescending(o => o.Fecha)
    					.Select(s => new DGVOrden 
    								{ 
    									ClienteNombre = s.Cliente.Nombre, 
    									Estado = dicEstadosOrdenes.First(x=> x.Key == s.Estado).Value, 
    									Matricula = s.Vehiculo.Matricula, 
    									Numero = s.Numero, 
    									OTrabajoId = s.OTrabajoId, 
    									Serie = s.Serie, 
    									Total = s.Total 
    								}).ToList();

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 13 de agosto de 2018 12:45
  • hola

    intenta usando

    Estado = dicEstadosOrdenes.First(x=> x.Key == s.Estado)?.Value, 

    de esta forma sino encuentra no fallara

    Operadores ?. y ?[]

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 13 de agosto de 2018 17:09
  • hola

    >>He probado lo de la ? y me da error:

    mm que raro, porque el FirstOrDefault() devolveria null aunque sea un dictionary

    >>En el linq si tiene valor s.Estado y el valor que tiene si está en el diccionario y en la prueba que he puesto, he puesto el valor 1 a la keyal poner

    alusar un valor 1 fijo te deja usar el First() ? porque si te deja entonces quiere decir que s.Estado esta tomando un valor que no existe en el diccionario, pero solo falla en runtime, valida los datos

    porque no cambias el diccionario por una List<> y defines la clase o sino usar una Tuple<>

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 13 de agosto de 2018 18:23

Todas las respuestas

  • hola

    podrias definir un linq dentro del select

    var _ordenes = db.OTrabajos
    					.Where(w => w.EmpresaId == empresaId)
    					.OrderByDescending(o => o.Fecha)
    					.Select(s => new DGVOrden 
    								{ 
    									ClienteNombre = s.Cliente.Nombre, 
    									Estado = dicEstadosOrdenes.First(x=> x.Key == s.Estado).Value, 
    									Matricula = s.Vehiculo.Matricula, 
    									Numero = s.Numero, 
    									OTrabajoId = s.OTrabajoId, 
    									Serie = s.Serie, 
    									Total = s.Total 
    								}).ToList();

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 13 de agosto de 2018 12:45
  • Hola Leandro:

    He probado lo que me indicas y me da el siguiente error:

    "The method 'First' can only be used as a final query operation. Consider using the method 'FirstOrDefault' in this instance instead."

    He cambiado el First por el FirstOrDefoult y entonces da el siguiente error:

    Message = "Unable to create a constant value of type 'System.Collections.Generic.KeyValuePair`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a...

    Sin embargo lo he probado fuera de linq de la siguiente forma y no da ningún error, por lo que no se si será por alguna incompatibilidad con Linq.

    var variable = Diccionarios.dicTipoCombustible.First(x => x.Key == 1).Value;

    Un Saludo.

    lunes, 13 de agosto de 2018 15:37
  • hola

    intenta usando

    Estado = dicEstadosOrdenes.First(x=> x.Key == s.Estado)?.Value, 

    de esta forma sino encuentra no fallara

    Operadores ?. y ?[]

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 13 de agosto de 2018 17:09
  • Hola Leandro:

    He probado lo de la ? y me da error:

    Error    CS0023    El operador '?' no se puede aplicar al operando del tipo 'KeyValuePair<int, string>'    DataAccess   

    En el linq si tiene valor s.Estado y el valor que tiene si está en el diccionario y en la prueba que he puesto, he puesto el valor 1 a la key que es la que trae el s.Combustible.

    var variable = Diccionarios.dicTipoCombustible.First(x => x.Key == 1).Value;

    Un Saludo.

    lunes, 13 de agosto de 2018 17:55
  • hola

    >>He probado lo de la ? y me da error:

    mm que raro, porque el FirstOrDefault() devolveria null aunque sea un dictionary

    >>En el linq si tiene valor s.Estado y el valor que tiene si está en el diccionario y en la prueba que he puesto, he puesto el valor 1 a la keyal poner

    alusar un valor 1 fijo te deja usar el First() ? porque si te deja entonces quiere decir que s.Estado esta tomando un valor que no existe en el diccionario, pero solo falla en runtime, valida los datos

    porque no cambias el diccionario por una List<> y defines la clase o sino usar una Tuple<>

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 13 de agosto de 2018 18:23
  • Hola Leandro:

    Si es menos complicado, ¿como se haría el dictionary como List<> para que se pueda usar por cualquier formulario como los dictionarys?

    public static Dictionary<int, string> dicEstadosOrdenes = new Dictionary<int, string>()
            {
                {1, "Pendiete" },
                {2, "Facturada" },
                {3, "Anulada" }
            };

    Ya que no se si primero hay que defirnirlo como una entidad y luego no se como cargar los datos, vamos que me he quedado descolocado.

    Al final lo que quiero es hacerlo de la manera menos complicada y que resulte más efectiva.

    Un Saludo.


    • Editado elturle lunes, 13 de agosto de 2018 19:03 Editado.
    lunes, 13 de agosto de 2018 19:02