Frage

Ich habe die unten Linq-Abfrage, die ein Textfeld nimmt die Y, N oder DBNULL sein kann und Füllt ein boolean? Parameter entweder mit True, False oder Null auf dem Wert des Feldes abhängig.

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

Die problematische Zeile ist

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

Nach der Lektüre bis fand ich eine Dokumentation, die besagt, dass die 2. und 3. Argumente der Inline bei Bedarf vom gleichen Typ sein oder miteinander implizit konvertierbar sein.

Meine Frage ist, wie kann ich diese Einschränkung zu umgehen, um mein gewünschtes Ergebnis zu erreichen?

Ich bin relativ neu in C #, so ist nicht vertraut mit all seinen Macken / Fähigkeiten vor.

War es hilfreich?

Lösung

mein Vorschlag wäre, es zu ersetzen sein mit:

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

der Grund, warum der Compiler ohne den Darstellern nicht ist sich einig, dass, auch wenn Sie es in ein Nullable-Struktur zu speichern, die ternären Operation überprüft, ob die Ergebnisse sind kompatibel durch eine implizite Konvertierung.

Ergebnisse true und false als bool Literale behandelt, nicht bool?, also nicht implizit konvertierbar null. Casting entweder Ergebnisse bool? wird sie vergleichbar machen. Der, den ich vorgeschlagen hat eine implizite Konvertierung zwischen bool? und null, und das funktioniert auch:

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

Welche eine implizite Konvertierung zwischen einem bool und bool? ist. Ich willkürlich die ersten bevorzugen ..

Andere Tipps

Sie können explizit konvertieren eine oder mehrere der Ausdrücke zu einem bool?:

(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? (bool?)false : (bool?)null)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top