C # utilizzando LINQ e Nullable booleano
-
02-10-2019 - |
Domanda
Ho la domanda sotto LINQ che prende un campo di testo che può essere Y, N o DBNull e popola un valore booleano? parametro con True, False o nulla a seconda del valore del campo.
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 tra loro.
La mia domanda è: come faccio ad avere intorno a questa limitazione per raggiungere il mio risultato desiderato?
Sono relativamente nuovo per C # in modo da non conosco tutte le sue stranezze / capacità ancora.
Soluzione
Il mio suggerimento sarebbe quello di sostituirlo con:
(i.targetmet != null) ? (bool?)(i.targetmet == "Y") : null;
la ragione per cui il compilatore non è d'accordo, senza il cast è che anche se si memorizza in una struttura nullable, i ternari verifiche di funzionamento se i risultati sono compatibili attraverso una conversione implicita.
Risultati true
e false
sono trattati come letterali bool
, non bool?
, quindi non implicitamente convertibile in null
. Casting entrambi 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;
Il che è una conversione implicita tra un bool
e bool?
. Ho arbitraria preferisco il primo ..
Altri suggerimenti
È possibile convertire in modo esplicito una o più delle espressioni a un bool?
:
(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? (bool?)false : (bool?)null)