2010-07-05 21 views
7

Tengo la siguiente consulta linq que toma un campo de texto que puede ser Y, N o DBnull y rellena un booleano? parámetro con True, False o null dependiendo del valor del campo.C# usando LINQ y Boolean Nullable

var dset = from i in tbdc.Talkbacks 
     where i.talkback_id == id 
     select new Talkback(
       i.talkback_id, i.acad_period, i.reference, 
       i.staff_member, i.date_received, i.no_talkers, 
       i.gender_id, i.names, i.type_id, 
       i.method_id, i.area_id, i.site_id, 
       i.category_id, i.date_closed, i.expenddate, 
       i.acknowledgementtarget, 
       (i.targetmet == "Y") ? true : 
        ((i.targetmet == "N") ? false : null), 
        (i.acknowledgementtargetmet != "N") ? true : false 

La línea problemático es

(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? false : null) 

Después de leer hasta que encontré algún tipo de documentación que establece que las 2ª y 3ª argumentos de la línea Cuando la necesidad de ser del mismo tipo o sean convertir implícitamente a uno otro.

Mi pregunta es, ¿cómo puedo evitar esta limitación para lograr el resultado deseado?

Soy relativamente nuevo en C#, así que todavía no estoy familiarizado con todas sus peculiaridades y capacidades.

Respuesta

6

Mi sugerencia sería sustituirlo por:

(i.targetmet != null) ? (bool?)(i.targetmet == "Y") : null; 

la razón por la que el compilador no está de acuerdo, sin el reparto es que incluso si lo almacena en una estructura que admite nulos, la operación ternaria verifica si los resultados son compatibles mediante una conversión implícita.

Resultados true y false son tratados como literales, no boolbool?, por tanto, no convertir implícitamente a null. Lanzar los resultados al bool? los hará comparables. El que yo sugerí tiene una conversión implícita entre bool? y null, y esto también funciona:

(i.targetmet != null) ? (i.targetmet == "Y") : (bool?)null; 

¿Qué es una conversión implícita entre un bool y bool?. Yo arbitrariamente prefiero el primero ..

+0

Eso funcionó muy bien Dynami. Ahora estoy obteniendo un problema más adelante en la línea en la que trato de usar el valor en un DisplayTemplate con el siguiente código: <% @ Control Language = "C#" Inherits = "System.Web.Mvc.ViewUserControl "%> <%: ((Boolean?) Model.Value == True)? "kpi_tick.png": "kpi_cross.png"%> La idea es que muestre una imagen de marca para la imagen verdadera, cruzada para la imagen falsa y no para indefinida (todavía no se haya hecho ese fragmento del código) . Me aparece el error "El nombre 'Verdadero' no existe en el contexto actual" – hermiod

+2

Este marcado se parece a ASP.NET, con el que he trabajado mucho últimamente. Así que tiro al azar en la oscuridad: ¿reemplazar True por verdadero? –

+0

Crea una clase estática llamada BoolHelper con un método estático bool Parse (cadena s) que contiene la solución de Dynami. Luego, usa eso para simplificar las cosas para tu analizador. –

2

Puede convertir explícitamente una o más de las expresiones a un bool?:

(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? (bool?)false : (bool?)null)