none
controlar excepcion first linq RRS feed

  • Pregunta

  • Hola, resulta que estoy haciendo una consulta que tiene que devolverme un numero entero o nothing, pero al usar en la sentencia linq:

    dim delegacion = (from del in _ctx.tdbDelegaciones where emp.delegacion = del.poblacion select del.codigo).First

    Cuando no devuelve un valor me salta una excepcion, actualmente lo e solucionado con FirstorDefault, pero esta no me sirve, ya que esta devuelve 0 en caso de no encontrar nada, y necesito que me devuelva nothing ya que puede existir algún registro en la tabla delegaciones que su codigo sea 0. Mi pregunta es:

    ¿Como puedo controlar la excepcion que me salta al usar First para determinar si la variable delegacion es nothing o no?

    Un saludo

    miércoles, 28 de mayo de 2014 7:55

Todas las respuestas

  • Hola,

    Incluye ese código dentro de un bloque try catch, y controla esa excepcion en concreto, si te salta, en el catch asigna tu el valor que quieras a la variable delegacion.

    Try
       delegacion = (From del In _ctx.tdbDelegaciones Where emp.delegacion = del.poblacion Select del.codigo).First
    Catch ex As 'Tu excepcion concreta'
       delegacion = Nothing
    End Try

    Espero que te sirva, salu2!!


    Jose Alberto Marti

    miércoles, 28 de mayo de 2014 8:07
  • Hola, gracias por responder, pero esque no tengo una sola variable hago el proceso este 3 veces, una variable con delegacion otra con departamento y otra con contrato, entonces tendría que mete 3 try catch, o hay alguna otra manera?

    un saludo

    miércoles, 28 de mayo de 2014 8:11
  • Hola, 

    Depende, si en el caso de que uno falle, todos van a ser Nothing, puedes meter todas las consultas en un solo bloque Try Catch y asignarle el Nothing a todas a la vez en el momento falle una. Si por el contrario, una puede ser Nothing, pero las otras tener valor, si que tendrás que poner tres bloques distintos.

    Salu2!!


    Jose Alberto Marti

    miércoles, 28 de mayo de 2014 8:16
  • Hola.

    Pues tendre que meter tres try catch porque cada una puede tener ser nothing o no. En la instruccion FirstorDefault de linq se le puede decir que valor puede tomar por defecto?

    un saludo

    miércoles, 28 de mayo de 2014 8:20
  • Hola, 

    Acabo de encontrar otra solución que te podría servir, porque me sonaba que se puede cambiar el valor por defecto que se devuelve en un fristordefault.

    Mira este link.

    Donde explica la función DefaultIfEmpty (en el segundo bloque de ejemplo). Así podrás evitar usar los TryCatch.

    Espero que te sirva, salu2!!


    Jose Alberto Marti

    miércoles, 28 de mayo de 2014 8:23
  • Muchas gracias entonces así deberia funcionar y devolverme nothing verdad?

    delegacion = (From del In _ctx.tdbDelegaciones Where emp.delegacion = del.poblacion Select del.codigo).DefaultIfEmpty(nothing)

    un salu2

    • Marcado como respuesta danipro1993 miércoles, 28 de mayo de 2014 8:38
    • Desmarcado como respuesta danipro1993 miércoles, 28 de mayo de 2014 14:19
    miércoles, 28 de mayo de 2014 8:32
  • Yo creo que debería ser esto:

    delegacion = (From del In _ctx.tdbDelegaciones Where emp.delegacion = del.poblacion Select del.codigo).First().DefaultIfEmpty(nothing)
    Creo que debería ser así, para que te coja el primero como hacías antes, y que si esa consulta no devuelve nada, coja el valor por defecto


    Jose Alberto Marti

    • Marcado como respuesta danipro1993 miércoles, 28 de mayo de 2014 8:38
    • Desmarcado como respuesta danipro1993 miércoles, 28 de mayo de 2014 14:16
    miércoles, 28 de mayo de 2014 8:37
  • Muchas gracias esta tarde lo pruebo!!

    un saludo

    miércoles, 28 de mayo de 2014 8:39
  • Hola, acabo de probar lo que hemos comentado anterior pero me salta esta excepción:

    Excepción no controlada del tipo 'System.NotSupportedException' en System.Data.Linq.dll
    Información adicional: Se ha utilizado una sobrecarga no compatible para el operador de consulta 'DefaultIfEmpty'.

    he probado con esto:

    dim delegacion = (from del in _ctx.tdbDelegaciones where emp.delegacion = del.poblacion select del.codigo).DefaultIfEmpty(Nothing).First()

    también e probado pasandole al defaultempty un numero entero, pero nada salta esa excepción. ¿Porque puede ser?

    Un saludo

    miércoles, 28 de mayo de 2014 14:19
  • Y has probado a cambiarle el orden? Es decir la consulta.First().DefaultIfEmpty(Nothing)

    Jose Alberto Marti

    miércoles, 28 de mayo de 2014 15:05
  • si, pero no se puede, da error de sintaxis, va primero el DefaultIfEmpty

    un saludo

    miércoles, 28 de mayo de 2014 15:26
  • Acabo de hacer unas pruebas, y el DefaultIfEmpty solo acepta valores que el tipo de variable destino pueda aceptar. Por ejemplo, si la variable destino es un string, el valor por defecto podría ser "W", pero no null. 

    Jose Alberto Marti

    miércoles, 28 de mayo de 2014 15:58