2010-12-15 15 views
11

Böyle bir yöntem sorgusu vardır: Linq SQL denemeden için:"Nullable nesnesinin bir değeri olmalıdır." Linq To-Sql

Çalışma zamanında
public IList<BusinessObject> GetBusinessObject(Guid? filterId) 
{ 
    using (var db = new L2SDataContext()) 
    { 
     var result = from bo in db.BusinessObjects 
        where (filterId.HasValue) 
           ? bo.Filter == filterId.value 
           : true 
        orderby bo.Name 
        select SqlModelConverters.ConvertBusinessObject(bo); 
     return result.ToList(); 
    } 
} 

, bu System.InvalidOperationException: Nullable object must have a value.

Debugger baktığımızda atar, sorun benim nerede Clause olduğunu Tüm şeyi SQL'e dönüştürmek, böylece filterId NULL olsa bile, filterId.value erişmeye çalışacaktır.

C# derleyicisi/CLR'nin kod bloğu olarak tümceyi nereye yazacağını ve yalnızca iki daldan birini Linq To SQL'e göndereceğini düşündüm. Benim Refactored versiyonu çalışır, ancak çok şık değil

:

public IList<BusinessObject> GetBusinessObject(Guid? filterId) 
{ 
    using (var db = new L2SDataContext()) 
    { 
     var temp = from bo in db.BusinessObjects select bo; 
     if(filterId.HasValue) temp = temp.Where(t => t.Filter == filterId.Value); 
     var result = from t in temp 
        orderby t.Name 
        select SqlModelConverters.ConvertBusinessObject(bo); 
     return result.ToList(); 
    } 
} 

Bunun yoktur Lazy-Değerlendirme yalnızca bir sorgu gerçekten gönderilir emin olun, ama bu geçici bir nesne sahip olacağını biliyoruz gerçekten harika.

cevap

16

denedin:

where filterId == null || t.Filter == filterId 
+1

vay Oh, bu mükemmel çalışıyor! Beni, hafif okunamayan tersiyer operatörünü kullanmaktan kurtarır ve yalnızca filterId yerine filterId.Value öğesine gereksiz yere erişmenin neden olduğu gerçek İstisnayı çözer. –

1

Düzeltmeniz kesinlikle doğrudur. İşlev girdinize göre dinamik olarak bir sorgu oluşturmaya çalışıyorsunuz. Yine de, WHERE TRUE nolu kaynağı vermek yerine, buradaki tümceyi atlamak iyi bir fikirdir. Bu sorguyu yazıyor olsaydım, sabit sürümünüzle kendim giderdim.

Dil anahtar sözcüklerini kullanmak kadar güzel değil, ancak sorguya benim görüşüme göre yaklaşmanın hala doğru yolu.