2010-07-05 13 views
7

Ich habe die unten linq Abfrage, die ein Textfeld, das Y, N oder DBnull sein kann und ein boolean füllt? Parameter mit entweder True, False oder Null, abhängig vom Wert des Feldes.C# mit LINQ und 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 

Die problematische Zeile ist

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

Nach der Lektüre bis ich eine Dokumentation, die, wenn notwendig die 2. und 3. Argumente der Inline-Staaten gefunden vom gleichen Typ sein oder zu einer implizit konvertierbar sein Ein weiterer.

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

Ich bin relativ neu in C#, bin also noch nicht mit all seinen Macken/Fähigkeiten vertraut.

Antwort

6

Mein Vorschlag zu ersetzen wäre es mit:

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

der Grund, warum der Compiler nicht zustimmen, ohne Die Umwandlung besteht darin, dass die ternäre Operation selbst dann, wenn Sie sie in einer nullfähigen Struktur speichern, überprüft, ob die Ergebnisse durch eine implizite Konvertierung kompatibel sind.

Ergebnisse true und false als bool Literale behandelt, nicht bool?, also nicht implizit konvertierbar null. Casting Ergebnisse entweder bool? werden 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; 

, die eine implizite Konvertierung zwischen einem bool und bool? ist. Ich bevorzuge die erste.

+0

Das hat super funktioniert Dynami. Ich bekomme jetzt ein Problem weiter unten, wo ich versuche, den Wert in einem DisplayTemplate mit dem folgenden Code zu verwenden: <% @ Control Language = "C#" Inherits = "System.Web.Mvc.ViewUserControl "%> <%: ((Boolean?) Model.Value == True)? "kpi_tick.png": "kpi_cross.png"%> Die Idee ist, dass es ein Häkchenbild für echt, Kreuzbild für falsch und kein Bild für undefiniert anzeigt (habe dieses Bit des Codes noch nicht gemacht) . Ich bekomme den Fehler "Der Name 'True' existiert nicht im aktuellen Kontext" – hermiod

+2

Dieses Markup sieht aus wie ASP.NET, mit dem ich in letzter Zeit viel gearbeitet habe. So zufällig im Dunkeln geschossen: Ersetze Wahres mit Wahrem? –

+0

Erstellen Sie eine statische Klasse namens BoolHelper mit einer statischen Methode bool Parse (Zeichenfolge s), die Dynamis Lösung enthält. Dann benutze das, um die Dinge für deinen Parser zu vereinfachen. –

2

Sie explizit umwandeln kann oder mehrere der Ausdrücke ein bool?:

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