2013-05-19 11 views

Odpowiedz

13

Problem pojawia się, ponieważ dostęp do Value property o Nullable typu, który jest null (lub, bardziej precyzyjnie, którego HasValue nieruchomość jest false). Jak naprawić to zależy od tego, co chcesz zrobić:

  1. Jeśli chcesz odfiltrować elementy gdzie TourOpID jest null, wystarczy dodać where klauzuli:

    ... 
    (from b in CompleteData 
    where b.TourOpID != null   // filter 
    select b.TourOpID).Distinct() 
    ... 
    
  2. Jeśli chcesz użyć wartość zastępcza, np 0, jeśli TourOpID jest null, należy użyć null coalescing operator??, który konwertuje int? w produkt int:

    ... 
    (from b in CompleteData 
    select b.TourOpID ?? 0).Distinct() 
    ... 
    

    lub, alternatywnie,

    ... 
    select new ComboBoxItemString() { ValueString = a.GetValueOrDefault().ToString() }); 
    
  3. Jeśli chcesz tylko pokazać inny wpis ComboBox if TourOpID ma wartość null, użyj operatora trójskładnikowego ?::

    ... 
    select new ComboBoxItemString() { 
        ValueString = (a == null ? "no tour operator" : a.Value.ToString()) 
    }); 
    

    Jeśli chcesz pokazać pusty ciąg jeśli a jest null, rozwiązanie jest jeszcze prostsze:

    ... 
    select new ComboBoxItemString() { ValueString = a.ToString() }); 
    

    od Nullable.ToString zwraca pusty ciąg znaków, jeśli nie ma wartości.

+3

Najlepsza odpowiedź zdecydowanie. +1. –

1

użycie where

from b in CompleteData where b.TourOpID != null select b.TourOpID 
1

dlaczego nie można po prostu użyć ValueString = a.ToString() zamiast ValueString = a.Value.ToString(). Jeśli a ma wartość, to zwróci tę wartość do napisu, jeśli nie - a.ToString() zwróci pusty ciąg znaków.

IEnumerable<decimal?> arr = new List<decimal?> 
              { 
               1m, 4m, null, 10m, 6m 
              }; 

foreach (var @decimal in arr) 
{ 
     Console.WriteLine(@decimal.ToString()); 
} 

Wyjście jest:

1 
4 

10 
6 
Powiązane problemy