2010-07-05 23 views
7

Mam poniżej kwerendę linq, która pobiera pole tekstowe, które może być Y, N lub DBnull i wypełnia boolean? parametr z wartością True, False lub null w zależności od wartości pola.C# przy użyciu LINQ i 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 

Problematyczny jest to

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

Po zapoznaniu się znalazłem jakąś dokumentację, która stwierdza, że ​​2 i 3 argumenty inline jeśli trzeba być tego samego typu lub być niejawnie zamienny do jednego inne.

Moje pytanie brzmi: jak obejść to ograniczenie, aby osiągnąć pożądany rezultat?

Jestem stosunkowo nowy w C#, więc nie jestem jeszcze zaznajomiony ze wszystkimi jego dziwactwami/możliwościami.

Odpowiedz

6

Moja sugestia byłoby zastąpić go:

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

powód dlaczego kompilator nie zgadza się bez obsada jest taka, że ​​nawet jeśli przechowuje się ją w strukturze zerowej, operacja potrójna sprawdza, czy wyniki są zgodne przez niejawną konwersję.

Wyniki true i false są traktowane jako bool literały, a nie bool?, więc nie niejawnie zamienny do null. Przesyłanie wyników do bool? spowoduje ich porównywanie. Jedna Zasugerowałem ma niejawna konwersja między bool? i null, i to działa zbyt:

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

który jest niejawna konwersja między bool i bool?. Ja arbitralnie wolę pierwszy ..

+0

To działało świetnie Dynami. Mam teraz problem dalej w linii, gdzie próbuję użyć wartość w DisplayTemplate z poniższym kodem: <% @ Control Language = "C#" Dziedziczy = "System.Web.Mvc.ViewUserControl "%> <%: ((Boolean?) Model.Value == True)? "kpi_tick.png": "kpi_cross.png"%> Chodzi o to, że wyświetli on obraz tyknięcia dla prawdziwego, krzyżykowego dla fałszu i brak obrazu dla niezdefiniowanego (jeszcze nie wykonano tego fragmentu kodu) . Otrzymuję błąd "Nazwa" True "nie istnieje w bieżącym kontekście" – hermiod

+2

Ten znacznik wygląda na ASP.NET, z którym ostatnio dużo współpracowałem. Więc losowe ujęcie w ciemności: zastąp Prawdę prawdą? –

+0

Utwórz klasę statyczną o nazwie BoolHelper za pomocą statycznej metody Bool Parse (string s) zawierającej rozwiązanie Dynami. Następnie użyj tego, aby uprościć rzeczy dla twojego parsera. –

2

Można jawnie przekonwertować jednego lub więcej wyrażeń Do bool?:

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