2010-07-05 19 views
7

Ho la query linq seguente che accetta un campo di testo che può essere Y, N o DBnull e popola un valore booleano? parametro con True, False o null in base al valore del campo.C# usando LINQ e Nullable Boolean

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 linea problematico è

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

Dopo aver letto ho trovato alcuni documenti in cui si afferma che il 2 ° e 3 ° argomenti della linea, se necessità di essere dello stesso tipo o la conversione implicita una un altro.

La mia domanda è: come posso aggirare questa limitazione per ottenere il risultato desiderato?

Sono relativamente nuovo a C# quindi non ho ancora familiarità con tutte le sue peculiarità/capacità.

risposta

6

Il mio suggerimento sarebbe quello di sostituirlo con:

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

il motivo per cui il compilatore non è d'accordo, senza il cast è che anche se lo memorizzi in una struttura nullable, l'operazione ternaria controlla se i risultati sono compatibili attraverso una conversione implicita.

Risultati true e false sono trattati come bool letterali, non bool?, quindi non implicitamente convertibile in null. Lanciare i risultati a bool? li renderà comparabili. Quello che ho suggerito ha una conversione implicita tra bool? e null, e questo funziona anche:

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

Che è una conversione implicita tra un bool e bool?. Io preferisco arbitrariamente il primo ..

+0

Questo ha funzionato alla grande Dynami. Ora sto riscontrando un problema più in là dove sto cercando di utilizzare il valore in un DisplayTemplate con il codice seguente: <% @ Control Language = "C#" Inherits = "System.Web.Mvc.ViewUserControl "%> <%: ((booleano?) Model.Value == True)? "kpi_tick.png": "kpi_cross.png"%> L'idea è che visualizzerà un'immagine di spunta per vero, immagine incrociata per falso, e nessuna immagine per indefinito (non hanno ancora fatto quel pezzo di codice) . Ricevo l'errore "Il nome 'True' non esiste nel contesto corrente" – hermiod

+2

Questo codice ha l'aspetto di ASP.NET, con cui ho lavorato molto ultimamente. Quindi, colpo casuale nel buio: sostituire True con vero? –

+0

Creare una classe statica chiamata BoolHelper con un metodo statico bozza Parse (stringa s) che contiene la soluzione di Dynami. Quindi usalo per semplificare le cose per il tuo parser. –

2

È possibile convertire in modo esplicito una o più delle espressioni a un bool?:

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