2011-06-03 17 views
5

Bazı nullable çift alanları olan bir tablom var. doğrudan benLinqToSql sınıflarının System.Nullable <T> alanları ile nasıl doğru şekilde?

Argüman tipi System.Nullable

Nasıl bu doğru ile anlaşma yapmak çifte türü parametresine atanabilir değil almak alanını kullanmaya çalışıyor LinqToSQL ile çalışma?

+0

Bu gerçekten LINQ ile ilgisi yok. NULL değerler ile uğraşmak için daha genel bir SO araştırması düşünün. –

+3

Gerçek kodu gerçek hata mesajıyla birlikte göndermelisiniz. Lütfen ne yapmaya çalıştığını tahmin etmeyin. – Gabe

cevap

18

Sorun, Linq ile ilgisi yoktur. double ve double?/Nullable<double> arasında dönüşüm yapılması gerekir.

double için double? den

örtük dönüştürme izin verilmez: Nullable<T> null ise (Bu NullReferenceException atacağım

double? foo ; 
double bar = foo.Value ; 

:

double? foo ; 
double bar = foo ; 
  • doğrudan çift değere başvurabilir Yani, .HasValue yanlıştır).

  • Bunu yayınlayabileceğim: Nullabl<T> null ise

    double? foo ; 
    double bar = (double) foo ; 
    

    Yine, bir istisna elde edersiniz.

  • Sen Nullable<T> boşsa varsayılan bir değer atamak için boş kaynaştırma operatörünü kullanabilirsiniz:

    double? foo ; 
    double bar = foo ?? -1.0 ; 
    

    Bu natch, NullReferenceException` sorunu önler.

    double? foo ; 
    double bar ; 
    
    if (foo.HasValue) 
    { 
        doSomething(foo.Value) ; 
    } 
    else 
    { 
        doSomething() ; 
    } 
    
: Eğer alternatif bir yol takip etmek düzenli koşullu mantığı kullanabilirsiniz, Nihayet

double? foo ; 
double bar = (foo.HasValue ? foo.Value : -2) ; 
  • :

  • Sen boş kaynaştırma operatörü olarak aynı damarda üçlü operatörünü kullanabilirsiniz

    Bunlar seçenekler hakkında. Hangisi doğru? Dunno. Bağlamınıza göre değişir.

  • -1

    Ya da yayınlayabilirsiniz: double yourVariable = (double)ValueFromDb veya yalnızca double?: double yourVaraible = ValueFromDb.Value Değerini yakalayabilirsiniz. Ya doğru. Eğer bir Nullable<T> varsa ve tip T değeri gerektiğinde

    +2

    Ve her ikisi de * patlayabilir *. Çift v = nullabledouble düşünün? 'double age = nullableAge gibi somedefaultdouble'? Double.NaN (evet, bu günlerde kesirli yıllarda sayıyorum ;-) –

    +0

    null birleştirici işleç için null değer "has" değerinin – Sung

    7

    Sen

    double value = theObject.TheProperty.GetValueOrDefault(); 
    

    kullanabilirsiniz. Bu, herhangi bir null değerini, bir çift için 0,0 olacak olan T varsayılan değerine normalleştirecektir. Varsayılandan diğer bir şey istiyorsanız, başka şekilde çalışabilirsiniz.

    double value = theObject.TheProperty ?? 1d; // where 1 replaces any null 
    
    +1

    +1 olup olmadığını kontrol ederek 2. sürümü kullandığınızdan emin olun. ve "GetValueOrDefault" –

    2

    İki yaklaşım vardır.

    1. Çift? Gibi null türlerini kullanın. Varlık sınıfınız iki kişilik bir mülk sahibi olabilir mi? ve müşteri kodunuz null tipiyle çalışacaktır.

      public class Person 
      { 
      
          public string FirstName { get; set; } 
      
          public string LastName { get; set; } 
          public double? Age { get; set; } 
      
          public Person() 
          { 
          } 
          public Person(IDataRecord record) 
          { 
           FirstName = (string) record["first_name"]; 
           LastName = (string) record["last_name"]; 
           Age = (double?) record["age"]; 
          } 
      } 
      
    2. BOŞ varsa güvenli bir varsayılan değer seçer atama etrafında sarıcı yaz. Veri kayıt sınıfından bir uzantı yöntemi kullanmak ve orada bir SafeConvert yöntemi koymak istiyorum.

    İlgili konular